0

对于示例 1,我需要一个更短且更简洁的解决方案。因此,需要在某个 Activity/Fragment 启动之前完成多个异步调用。示例 1 的成员布尔值非常混乱和丑陋,但可以工作。

我正在考虑使用 Google Tasks API。但为此,我需要添加一个 google-services.json 并连接到“Google 登录”、“分析”或“云消息传递”,我认为这些我不需要。必须有更好的方法还是这是正确的方法?

示例 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) {
        }
    });
4

2 回答 2

2

正如所指出的,RxJava 可能是一个更好的解决方案。原因是因为您可以将多个 api 请求、数据库请求链接成一个看起来优雅和干净的具体代码块。例如,请参阅下面我想说的内容:

Subscription subscription = apiService.getUser(someId)
    .flatMap(user -> apiService.getFavourites(user.getFavouritesTag())
    .subscribe(favourites -> view.updateFavouritesList(favourites), 
        throwable -> Log.e(TAG, throwable.printStackTrace());
于 2017-05-11T09:10:55.717 回答
1

您是否考虑过学习 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/

于 2017-05-11T09:02:24.887 回答