2016-10-12 27 views
1

我是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类不会等到函数返回到调用序列。

任何人都可以请建议我有什么更好的方法来做到这一点。

谢谢

回答

2

我想你可以使用一个接口来处理回调。

第一步:定义一个接口

public interface LoginListener{ 
public void success(Response<UserToken> response); 
public void failed(String message); 
} 

第二步:使用你所使用改装的方法,此接口。

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; 
} 

我希望这样可以帮到你。

0

call.enqueue()是异步..呼叫在后台完成,然后,一旦通话结束,这两个回调的一个叫,无论是onResponseonFailure

call.execute()是同步的,它会阻止执行,直到调用结束,但在这种情况下,你需要手动处理线程(记住,在android中你不能阻塞UI线程)。我们推荐enqueue

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(...); 
     } 
    }); 
}