I like use groundy for the command service
public class LoginCommand extends GroundyTask{
private static final String ARG_PASSWORD = "arg_password";
private static final String ARG_USER = "arg_username";
@Override
protected TaskResult doInBackground() {
String userName = getStringArg(ARG_USER);
String password = getStringArg(ARG_PASSWORD);
//do something
return succeeded();
}
public static void start(Context context, BaseLoginCommandCallback callback, String login, String password) {
Groundy.create(LoginCommand.class)
.arg(ARG_USER, login)
.arg(ARG_PASSWORD, password)
.callback(callback)
.queueUsing(context);
}
public static abstract class BaseLoginCommandCallback{
@OnSuccess(LoginCommand.class)
public void handleSuccess(){
onLoginSuccess();
}
@OnFailure(LoginCommand.class)
public void handleFailure(){
onLoginError();
}
protected abstract void onLoginSuccess();
protected abstract void onLoginError();
}
}
or use retrofit + gson ─ you can use groundy/AsyncTask/service + retrofit or use asynchronous request retrofit
model:
public class SignRequest {
private String login;
private String password;
public SignRequest(String login, String password) {
this.login = login;
this.password = password;
}
public SignRequest() {
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
public class SignResponse implements Parcelable {
private long id;
private String login;
private String message;
@SerializedName("auth_token")
private String authToken;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getAuthToken() {
return authToken;
}
public void setAuthToken(String authToken) {
this.authToken = authToken;
}
public SignResponse() {
}
public SignResponse(Parcel in) {
this.id = in.readLong();
this.login = in.readString();
this.message = in.readString();
this.authToken = in.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeLong(id);
out.writeString(login);
out.writeString(message);
out.writeString(authToken);
}
}
API:
public interface Api {
public static final String URL = "http://xxxxxx/api/v1";
static final String AUTH_SIGNIN = "/auth/signin";
static final String AUTH_SIGNUP = "/auth/signup";
static final String QUERY_AUTH_TOKEN = "auth_token";
@POST(AUTH_SIGNIN)
void sign(@Body SignRequest request, Callback<SignResponse> callback);
@POST(AUTH_SIGNIN)
SignResponsesign(@Body SignRequest request);
@POST(AUTH_SIGNUP)
void signup(@Body SignUpRequest request, Callback<SignUpResponse> callback);
}
ASYNCHRONOUS:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_auth);
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(Api.URL)
.build();
Api api = restAdapter.create(Api.class);
SignRequest request= new SignRequest();
request.setLogin(login);
request.setPassword(password);
api.sign(request, new Callback<SignResponse>() {
@Override
public void success(SignResponse signResponse, Response response) {
Log.d("api", "login: " + signResponse.getLogin());
.......
}
@Override
public void failure(RetrofitError error) {
.....
});
}
SYNCHRONOUS(for exemple AsyncTask):
......
@Override
protected Void doInBackground(SignRequest... params) {
SignRequest request = params[0];
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(Api.URL)
.build();
Api api = restAdapter.create(Api.class);
SignResponse response = api.sign(request);
return null;
}
.....