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());