Android 改造:如何确保第二次调用等待第一次调用的结果
我有一个应用程序,在其中我使用MyApplication.onCreate()方法中带有回调的简单改型异步调用进行登录,并将我作为全局变量返回的用户ID存储在改型回调中的MyApplication中 现在开始第一个活动onCreate方法。我在单独的APi调用中使用从登录APi调用中检索到的用户ID来检索一些特定于用户的数据 问题是,在activityoncreate方法中,当我想调用第二个API调用时。由于MyApplication中的第一个调用尚未完成执行,并且尚未设置userId,因此userId仍然为null 如何确保第二次调用仅在第一次调用返回用户ID并正确设置后执行 请给我一些建议 MyApplication类Android 改造:如何确保第二次调用等待第一次调用的结果,android,rest,android-asynctask,retrofit,Android,Rest,Android Asynctask,Retrofit,我有一个应用程序,在其中我使用MyApplication.onCreate()方法中带有回调的简单改型异步调用进行登录,并将我作为全局变量返回的用户ID存储在改型回调中的MyApplication中 现在开始第一个活动onCreate方法。我在单独的APi调用中使用从登录APi调用中检索到的用户ID来检索一些特定于用户的数据 问题是,在activityoncreate方法中,当我想调用第二个API调用时。由于MyApplication中的第一个调用尚未完成执行,并且尚未设置userId,因此us
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)
方法onUserIdLoaded(id)
事件,并仅在触发此回调时启动第二个请求您需要在活动中同时拨打这两个电话 方式1: 在活动中进行首次调用,而不是在应用程序类中。 第一次呼叫成功后,进行第二次呼叫 方式2: 使用事件总线
buddy遵循@Gennadii Saprykin的答案,因为这是一个完美的解决方案。使用RxJava,并链接调用。(改装与rx集成得非常好)