2016-05-25 10 views
5

私は同様の質問が出されていることを認識していますが、私はアンドロイドに慣れていて、ちょっと違う文脈になっているので少し混乱しています。retrofit2が非同期を続行するまで待つ最善の方法

私はCountDownLatchだけでなく、スレッドを使用して見て、どのメソッドを使用するか分からない。どんな助けでも大歓迎です。私はSharedPreferencesのためにcommit()の代わりにapply()を使ってみました。

LoginActivityから2回retrofit2コールを行っています。 2番目の呼び出しで使用する最初の呼び出しからトークンが必要です。最初のレトロフィットコールのonResponseメソッドでsharedpreferencesの文字列にトークンを保存しています。私の2番目の呼び出しで

serverTokenの値はアプリ

第一の呼び出し(入手トークン)の前回の実行に設定されたトークンとして戻って来ているが

call.enqueue(new retrofit2.Callback<TokenResponse>() {  

      @Override 
      public void onResponse(Call<TokenResponse> call, retrofit2.Response<TokenResponse> response) { 

       if (response.isSuccessful()) { 
        TokenResponse tokenResponse = response.body(); 

        LoginActivity.editor.putString("serverToken", tokenResponse.getAccessToken()); 
        LoginActivity.editor.commit(); 

       } else { 
        Log.i("Server Token", "failed"); 
       } 
      } 
} 

LoginActivityをonResponse

public class LoginActivity extends AppCompatActivity { 

    public static SharedPreferences preferences; 
    public static SharedPreferences.Editor editor; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     authenticationController = new AuthenticationController(); 
     preferences = PreferenceManager.getDefaultSharedPreferences(this); 
     editor = preferences.edit(); 
    } 

    public void onLoginClicked(View view) { 
     getToken(); //FIRST RETROFIT CALL 
     connectToPush(); //SECOND CALL WHERE I NEED TOKEN FROM FIRST CALL 
    } 

    public void getToken() { 
     authenticationController.login(grantType, username, password); 
    } 

    public void connectToPush() { 
     authenticationController.connectToPush(); 
    } 

私の第二のレトロフィットコール

public void connectToPush(){ 

    Log.i("sharedpreferencesToken", LoginActivity.preferences.getString("serverToken", "null serverToken")); 

} 
+0

私はRetrofitに精通していませんが、AsyncTaskを使用している場合はAsyncTask.get()を使用して結果を待つことができます。 https://developer.android.com/reference/android/os/AsyncTask.html#get() –

+0

提案いただきありがとうございます。私はretrofit2を使用して非同期に呼び出しを行うcall.enque()(私のコードを編集)を使用しています。私は、私があなたがレトロフィットで提案したものを実装できるかどうか分からない。 – HappyPoofySquirrel

答えて

0

まあ、私は解決策を見つけることになりました。最初の呼び出しのonResponseに改造githubの
「方法2をトリガする方法1からのコールバックを使用して」私はconnectToPushを移動
()の答えを見つけました。

call.enqueue(new retrofit2.Callback<TokenResponse>() {  

      @Override 
      public void onResponse(Call<TokenResponse> call, retrofit2.Response<TokenResponse> response) { 

       if (response.isSuccessful()) { 


       TokenResponse tokenResponse = response.body(); 

       LoginActivity.editor.putString("serverToken", tokenResponse.getAccessToken()); 
       LoginActivity.editor.commit(); 

       connectToPush(); //MOVED TO HERE 

      } else { 
       Log.i("Server Token", "failed"); 
      } 
     } 
} 

質問を削除してください。他の人を助けるかもしれないので残しておきます

0

connectToPush();は、Retrofit通話のonResponseから呼び出すことができます。

1

onResponse()メソッドはコールバックインターフェイスです。単純にコールバックインターフェイスとは、リクエストした\ event(コールバックしてコールバック)から情報を取得し、実行したいことを実装する場所を意味します。 (それはインターフェースなので、それを実装して、@Overrideアノテーションを実装します)。あなたは、少なくともではない、この場合には、CountDownLatchを必要としない

  1. 、およびRetrofit2はあなたのためのスレッドの世話をする:

    これが意味しています。

  2. SharedPreferencesが本当に必要でない場合は、そのインスタンスがそのコールバックから直接的に必要なメソッドを呼び出すことができます(次のリクエスト以外の理由でそれを保存しない限り、 )。

  3. 後で必要とするために値をローカルに保存する場合(または後で自動ログインの場合はSharedPreferencesを使用できますが、そのインスタンスで値を取得する必要はありません - それはあなたがすぐそこに値を保存する(コールバックインスタンスに存在するので、それはレスポンスが簡単に渡すことができ、正確な値を保持しながら、再び環境設定からそれをロードするために冗長だそう

call.enqueue(new retrofit2.Callback<TokenResponse>() {  

     @Override 
     public void onResponse(Call<TokenResponse> call, retrofit2.Response<TokenResponse> response) { 

      if (response.isSuccessful()) { 
       TokenResponse tokenResponse = response.body(); 

       //right here you can call the other request and just give it the token 
       connectToPush(tokenResponse); 

       //if you really need to, save your value 
       LoginActivity.editor.putString("serverToken", tokenResponse.getAccessToken()); 
       LoginActivity.editor.commit(); 

      } else { 
       Log.i("Server Token", "failed"); 
      } 
     } 
} 

あなたの2番目の勘定にl:

public void connectToPush(TokenResponse tokenFromFirstRequest){ 

//fire the next request using your token as a param! 

} 
関連する問題