Android 改造:如何确保第二次调用等待第一次调用的结果

Android 改造:如何确保第二次调用等待第一次调用的结果,android,rest,android-asynctask,retrofit,Android,Rest,Android Asynctask,Retrofit,我有一个应用程序,在其中我使用MyApplication.onCreate()方法中带有回调的简单改型异步调用进行登录,并将我作为全局变量返回的用户ID存储在改型回调中的MyApplication中 现在开始第一个活动onCreate方法。我在单独的APi调用中使用从登录APi调用中检索到的用户ID来检索一些特定于用户的数据 问题是,在activityoncreate方法中,当我想调用第二个API调用时。由于MyApplication中的第一个调用尚未完成执行,并且尚未设置userId,因此us

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

现在开始第一个活动onCreate方法。我在单独的APi调用中使用从登录APi调用中检索到的用户ID来检索一些特定于用户的数据

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

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

请给我一些建议

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

        }
    });

}
公共类MyApplication扩展应用程序{
私有字符串用户标识;
@凌驾
public void onCreate(){
super.onCreate();
//登录,此处检索密码。
修改client.login(登录名、密码、新回调(){
@凌驾
public void成功(字符串userId,响应){
setUserId(userId);
}
@凌驾
公共无效失败(错误){
}
});
}
公共类MainActivity扩展了FragmentActivity{
私人语境;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
上下文=这个;
//做一些逻辑分析。
字符串userId=((MyApplication)getApplication()).getUserId();
//现在,由于MyApplication类中的第一个调用尚未完成,因此USERID仍然为NULL。
callSecondAPICall(userId,new Callback(){
@凌驾
公共无效成功(MyResponse MyResponse,Response Response){
//做点什么。
}
@凌驾
公共无效失败(错误){
}
});
}

在成功的第一次调用中,只进行第二次调用。这意味着在成功的第一次调用被调用之前,您不会启动您的活动。这样,您可以确保第一次调用成功并保存用户ID。

您可以通过以下方式实现:

  • 使用方法
    onUserIdLoaded(字符串id);
  • 在您的
    main活动中实现此接口
  • 在活动的
    onResume()
    ((MyApplication)getApplication())。addListener(listener);
    onPause()
    中删除此侦听器:
    ((MyApplication)getApplication())。RemovelListener(listener);
  • 当第一个请求完成时,调用
    onUserIdLoaded(id)
    方法
  • 在“活动”中,您检查id是否可用。如果可用,您只需将其用于第二个请求。如果不可用,则订阅
    onUserIdLoaded(id)
    事件,并仅在触发此回调时启动第二个请求

  • 您需要在活动中同时拨打这两个电话

    方式1

    在活动中进行首次调用,而不是在应用程序类中。 第一次呼叫成功后,进行第二次呼叫

    方式2: 使用事件总线

  • 来自应用程序类的用户ID调用的Post事件
  • 当您在活动中收到该事件时,启动第二次呼叫

  • buddy遵循@Gennadii Saprykin的答案,因为这是一个完美的解决方案。使用RxJava,并链接调用。(改装与rx集成得非常好)