Android 中的多个异步调用最佳实践
Multiple async calls best practices in Android
对于示例 1,我需要一个更短且更清晰的解决方案。因此需要在某个 Activity/Fragment 开始之前完成多个异步调用。示例 1 对于成员 bool 来说非常混乱和丑陋,但是可以工作。
我正在考虑使用 Google 任务 API。但为此我需要添加一个 google-services.json 并连接到 "Google Sign-in"、"Analytics" 或 "Cloud messaging",我认为我不需要。必须有更好的方法或者这是正确的方法吗?
示例 1:
boolean mIsFirstDone = false;
boolean mIsSecondDone = false;
boolean mAlreadyDone = false;
private void prepareSomeData() {
dataManager.requestSomeContent(new ApiCallback() {
@Override
public void onSuccess(final Object object) {
mIsFirstDone = true;
if(mIsFirstDone && mIsSecondDone && !mAlreadyDone) {
mAlreadyDone = true;
doSomething();
}
}
});
}
private void prepareSomeSettings() {
dataManager.requestSomeSettings(new ApiCallback() {
@Override
public void onSuccess(final Object object) {
mIsSecondDone = true;
if(mIsFirstDone && mIsSecondDone && !mAlreadyDone) {
mAlreadyDone = true;
doSomething();
}
}
});
}
有任务API:
Tasks.whenAll(SomeDataTask, SomeSettingsTask).addOnSuccessListener(executor, new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void v) {
doSomething();
}
}).addOnFailureListener(executor, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
您是否考虑过学习 RxJava 并将您的所有项目重新格式化为 RxJava 以及 API 的改造?
从这样的事情开始:
https://medium.com/yammer-engineering/chaining-multiple-sources-with-rxjava-20eb6850e5d9
https://adityaladwa.wordpress.com/2016/05/11/dagger-2-and-mvp-architecture/
如前所述,RxJava 可能是对此问题的更好解决方案。原因是因为您可以将多个 api 请求、数据库请求链接到一个看起来优雅干净的具体代码块中。例如,请参阅下面我要说的内容:
Subscription subscription = apiService.getUser(someId)
.flatMap(user -> apiService.getFavourites(user.getFavouritesTag())
.subscribe(favourites -> view.updateFavouritesList(favourites),
throwable -> Log.e(TAG, throwable.printStackTrace());
对于示例 1,我需要一个更短且更清晰的解决方案。因此需要在某个 Activity/Fragment 开始之前完成多个异步调用。示例 1 对于成员 bool 来说非常混乱和丑陋,但是可以工作。
我正在考虑使用 Google 任务 API。但为此我需要添加一个 google-services.json 并连接到 "Google Sign-in"、"Analytics" 或 "Cloud messaging",我认为我不需要。必须有更好的方法或者这是正确的方法吗?
示例 1:
boolean mIsFirstDone = false;
boolean mIsSecondDone = false;
boolean mAlreadyDone = false;
private void prepareSomeData() {
dataManager.requestSomeContent(new ApiCallback() {
@Override
public void onSuccess(final Object object) {
mIsFirstDone = true;
if(mIsFirstDone && mIsSecondDone && !mAlreadyDone) {
mAlreadyDone = true;
doSomething();
}
}
});
}
private void prepareSomeSettings() {
dataManager.requestSomeSettings(new ApiCallback() {
@Override
public void onSuccess(final Object object) {
mIsSecondDone = true;
if(mIsFirstDone && mIsSecondDone && !mAlreadyDone) {
mAlreadyDone = true;
doSomething();
}
}
});
}
有任务API:
Tasks.whenAll(SomeDataTask, SomeSettingsTask).addOnSuccessListener(executor, new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void v) {
doSomething();
}
}).addOnFailureListener(executor, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
您是否考虑过学习 RxJava 并将您的所有项目重新格式化为 RxJava 以及 API 的改造?
从这样的事情开始:
https://medium.com/yammer-engineering/chaining-multiple-sources-with-rxjava-20eb6850e5d9
https://adityaladwa.wordpress.com/2016/05/11/dagger-2-and-mvp-architecture/
如前所述,RxJava 可能是对此问题的更好解决方案。原因是因为您可以将多个 api 请求、数据库请求链接到一个看起来优雅干净的具体代码块中。例如,请参阅下面我要说的内容:
Subscription subscription = apiService.getUser(someId)
.flatMap(user -> apiService.getFavourites(user.getFavouritesTag())
.subscribe(favourites -> view.updateFavouritesList(favourites),
throwable -> Log.e(TAG, throwable.printStackTrace());