5

我意识到有人问过类似的问题,但我是 android 新手,发现答案有点令人困惑,因为它们的上下文略有不同。

我查看了 CountDownLatch 以及使用 Threads,但不确定使用哪种方法。任何帮助将非常感激。对于 SharedPreferences,我也尝试过使用 apply() 而不是 commit()。

我正在从 LoginActivity 进行 2 个 retrofit2 调用。我需要第一次通话中的令牌在第二次通话中使用。我在第一次改造调用的 onResponse 方法中将令牌保存到 sharedpreferences 中的字符串中。

在我的第二次调用中,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();
    }

我的第二次改造电话

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

在您的第二次通话中:

public void connectToPush(TokenResponse tokenFromFirstRequest){

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

}
于 2016-05-26T13:00:34.933 回答
0

好吧,我最终找到了解决方案。在改造 github 上找到了答案
“使用方法 1 的回调触发方法 2”
我将 connectToPush() 移到了第一次调用的 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();

                connectToPush(); //MOVED TO HERE

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

随意删除我的问题。我会留下它,因为它可能会帮助别人

于 2016-05-25T19:12:38.913 回答
0

您可以从 Retrofit 调用connectToPush();onResponse部分调用。

于 2016-05-25T19:13:13.427 回答