5

同様の質問が寄せられていることは承知していますが、私はアンドロイドが初めてで、コンテキストがわずかに異なるため、答えが少しわかりにくいと感じています。

スレッドの使用と同様に CountDownLatch を調べましたが、どの方法を使用すればよいかわかりません。どんな助けでも大歓迎です。また、SharedPreferences に commit() の代わりに apply() を使用してみました。

LoginActivity から 2 つの retrofit2 呼び出しを行っています。2 番目の呼び出しで使用するには、最初の呼び出しのトークンが必要です。最初の改造呼び出しの onResponse メソッドで、トークンを sharedpreferences の文字列に保存しています。

2 回目の呼び出しでは、serverToken の値が、アプリの前回の実行で設定されたトークンとして返されます。

最初の呼び出し (getToken) onResponse

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

ログイン アクティビティ

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

私の 2 回目のレトロフィット コール

public void connectToPush(){

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

}
4

3 に答える 3

1

このonResponse()メソッドはコールバック インターフェイスです。簡単に言えば、リクエスト\イベントから情報を取得し (呼び出した、それが戻ってきたので、コールバック)、それを使ってやりたいことを実装する場所であることを意味します (それはインターフェイス、それを実装するため、 @Override アノテーション)。

これの意味は:

  1. 少なくともこの場合は不要CountDownLatchで、Retrofit2 がスレッド化を処理します。

  2. は実際には必要ありませんSharedPreferences。情報はそのインスタンスにあるため、そのコールバックから直接必要なメソッドを呼び出すことができます(次のリクエスト以外の理由で保存したくない場合は、次を参照してください...)。

  3. 後で必要になるために値をローカルに保存する場合 (または後で自動ログインとして使用する場合は、 を使用できますSharedPreferencesが、そのインスタンスでそこから値を取得する必要はありません。コールバック インスタンス (すぐに値を保存します。単純に渡すことができる正確な値を応答が保持している間に、Prefs から再度ロードするのは冗長です。

それで:

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番目の呼び出しで:

public void connectToPush(TokenResponse tokenFromFirstRequest){

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

}
于 2016-05-26T13:00:34.933 に答える