我是android的初学者,我正在使用Retrofit 2.0进行http调用。因为,我在不同的活动中使用相同的调用,所以我在非活动类中创建了函数。
这里我的改造调用了非活动类代码,
public class ServerRequests {
private static ServerRequests serverRequests = new ServerRequests();
public static ServerRequests getInstance(){
return serverRequests;
}
public LoginResponse ClientLogin(final LoginRequest request, Context context){
final ProgressDialog dialog = DialogueUtils.getInstance().showProgressDialog(context);
dialog.setMessage("Loading...");
dialog.show();
RestApi mApi = RetrofitProvider.getInstance().getRestApi();
Call<UserToken> call = mApi.clientLogin(request);
// Stores Login response
final LoginResponse loginResponse = new LoginResponse();
call.enqueue(new Callback<UserToken>() {
@Override
public void onResponse(Call<UserToken> call, Response<UserToken> response) {
dialog.dismiss();
if (response.isSuccessful()){
loginResponse.setMloginstatus(true);
loginResponse.setStatusCode(response.code());
loginResponse.setUserToken(response.body());
return;
}
// response isn't successful
loginResponse.setMloginstatus(false);
loginResponse.setStatusCode(response.code());
loginResponse.setMessage(response.message());
loginResponse.setUserToken(null);
}
@Override
public void onFailure(Call<UserToken> call, Throwable t) {
dialog.dismiss();
loginResponse.setMloginstatus(false);
loginResponse.setUserToken(null);
loginResponse.setMessage(t.getMessage());
loginResponse.setStatusCode(FAILURE_ERROR);
}
});
return loginResponse;
}
}
我将在Activity类中调用上面的函数, 这是代码,
LoginRequest request = new LoginRequest();
request.setPassword(PASSWORD);
request.setEmail(USER_NAME);
// Calling Login function
LoginResponse response = ServerRequests.getInstance().ClientLogin(request, this);
这里,在活动类中接收响应之前,下一组代码行正在执行。因此,Activity类不会等到函数返回到调用序列。
任何人都可以建议我做什么更好的方法。
谢谢
答案 0 :(得分:2)
您无法从方法中返回结果,因为您正异步进行Retrofit调用。改为使用回调。
public interface GenericCallback<T> {
void success(T result);
void failure(... whatever you need);
}
public void ClientLogin(final LoginRequest request, Context context, final GenericCallback<LoginResponse> callback){
final ProgressDialog dialog = DialogueUtils.getInstance().showProgressDialog(context);
dialog.setMessage("Loading...");
dialog.show();
RestApi mApi = RetrofitProvider.getInstance().getRestApi();
Call<UserToken> call = mApi.clientLogin(request);
// Stores Login response
final LoginResponse loginResponse = new LoginResponse();
call.enqueue(new Callback<UserToken>() {
@Override
public void onResponse(Call<UserToken> call, Response<UserToken> response) {
dialog.dismiss();
if (response.isSuccessful()){
loginResponse.setMloginstatus(true);
loginResponse.setStatusCode(response.code());
loginResponse.setUserToken(response.body());
callback.success(loginResponse);
return;
}
// response isn't successful
loginResponse.setMloginstatus(false);
loginResponse.setStatusCode(response.code());
loginResponse.setMessage(response.message());
loginResponse.setUserToken(null);
callback.failure(...);
}
@Override
public void onFailure(Call<UserToken> call, Throwable t) {
dialog.dismiss();
loginResponse.setMloginstatus(false);
loginResponse.setUserToken(null);
loginResponse.setMessage(t.getMessage());
loginResponse.setStatusCode(FAILURE_ERROR);
callback.failure(...);
}
});
}
答案 1 :(得分:2)
我认为您可以使用接口来处理回调。
步骤1:定义界面
public interface LoginListener{
public void success(Response<UserToken> response);
public void failed(String message);
}
步骤2:在您使用改造的方法上使用此界面。
public LoginResponse ClientLogin(final LoginRequest request, Context context, LoginListener listener){
final ProgressDialog dialog = DialogueUtils.getInstance().showProgressDialog(context);
dialog.setMessage("Loading...");
dialog.show();
RestApi mApi = RetrofitProvider.getInstance().getRestApi();
Call<UserToken> call = mApi.clientLogin(request);
// Stores Login response
final LoginResponse loginResponse = new LoginResponse();
call.enqueue(new Callback<UserToken>() {
@Override
public void onResponse(Call<UserToken> call, Response<UserToken> response) {
dialog.dismiss();
listener.success(response);
}
@Override
public void onFailure(Call<UserToken> call, Throwable t) {
dialog.dismiss();
listener.failed("message error");
}
});
return loginResponse;
}
我希望,这种方式可以帮助你。
答案 2 :(得分:0)
call.enqueue()
是异步的...调用是在后台完成的,然后,一旦调用完成,就会调用两个回调中的一个,onResponse
或onFailure
call.execute()
是同步的,它会阻止执行直到调用结束,但在这种情况下你需要手动处理线程(请记住,在android中你不能阻止UI线程)。
我推荐enqueue
。