改造:如何确保第二次呼叫等待第一次呼叫的结果

时间:2015-08-06 00:16:45

标签: android rest android-asynctask retrofit

我有一个应用程序,我使用MyApplication.onCreate()方法中的Callback进行简单的改进异步调用来登录,并将我在getAppit回调中作为全局变量返回的userId存储在MyApplication中。

现在在第一个Activity onCreate方法上。我在单独的API调用中使用从登录APi调用中检索到的userId来检索一些用户特定数据。

问题是,当我想调用第二个API调用时,在Activity onCreate方法中。 userId仍为null,因为MyApplication中的第一个调用尚未完成执行且userId尚未设置。

如何确保仅在第一次调用返回userId并正确设置后执行第二次调用。

请建议。

MyApplication类

public class MyApplication extends Application {

private String userId;

@Override
public void onCreate() {
    super.onCreate();
    // login, password retrieved here.
    retrofitClient.login(login, password, new Callback<String>() {
        @Override
        public void success(String userId, Response response) {
            setUserId(userId);
        }

        @Override
        public void failure(RetrofitError error) {

        }
    });
}


public class MainActivity extends FragmentActivity {

private Context context;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    context = this;
    // do some logic.        
String userId = ((MyApplication) getApplication()).getUserId();
// NOW THE USERID is still NULL since the first call in the MyApplication      class is not done yet.
    retrofitClient.callSecondAPICall(userId, new Callback<ProductResponse>() {

        @Override
        public void success(MyResponse myResponse, Response response) {
    // do something.
        }

        @Override
        public void failure(RetrofitError error) {

        }
    });

}

3 个答案:

答案 0 :(得分:2)

您可以这样实现:

  1. 使用方法onUserIdLoaded(String id);
  2. 创建一个侦听器界面
  3. MainActivity
  4. 中实施此界面
  5. 在您的活动MyApplication onResume() ((MyApplication) getApplication()).addListener(listener);中为onPause()添加一位听众 在((MyApplication) getApplication()).removeListener(listener);中删除此侦听器: onUserIdLoaded(id)
  6. 第一个请求完成后,请调用onUserIdLoaded(id)方法。
  7. 在您的活动中,您可以检查ID是否可用。如果可用,您只需将其用于第二次请求即可。如果不是,则您订阅{{1}}事件并仅在触发此回调时启动第二个请求。

答案 1 :(得分:0)

在第一次调用onSuccess时,只进行第二次调用。这意味着在第一次调用onSuccess之前,你不会开始你的活动。通过此操作,您可以确保第一次调用成功并保存userId。

答案 2 :(得分:0)

你需要在活动中进行两次调用

方式1

在活动中进行第一次调用,而不是在应用程序类中。     在第一次通话成功时进行第二次通话。

方式2 : 使用EventBus

  1. 发布应用程序类的UserID调用事件
  2. 当您在活动中收到该事件时,会启动第二次通话。