2016-10-12 4 views
1

私は初心者ですが、http呼び出しでRetrofit 2.0を使用しています。異なるアクティビティで同じ呼び出しを使用するので、私は非アクティビティクラスで関数を作成しました。ノンアクティビティクラスでの改修コール

ここで受信する前に、非アクティビティクラスのコードで私の改造呼び出し、

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

応答クラスでは、次の一連のコード行が実行されています。したがって、アクティビティクラスは関数が呼び出し元のシーケンスに戻るまで待たない。

誰でも私にこれを行うためのより良いアプローチがお勧めしますか?

は、 onResponseまたは onFailureのいずれかを呼び出しは、バックグラウンドで行われ、その後、できるだけ早くコールが終了するように、2つのコールバックの一つが呼ばれ..あなた

答えて

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

この方法でお手伝いできます。

0

call.enqueue()は非同期ですありがとうございます。

call.execute()が同期すると、呼び出しが終了するまで実行がブロックされますが、その場合は手動でスレッドを処理する必要があります(アンドロイドでは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(...); 
     } 
    }); 
} 
関連する問題