多个异步调用Android中的最佳做法

时间:2017-05-11 08:33:09

标签: java android google-tasks-api

我需要一个更短的&示例1的清洁解决方案。因此,在某个Activity / Fragment可以启动之前,需要完成多个异步调用。示例1对于成员bool非常混乱和丑陋,但是有效。

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

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

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:1)

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

Subscription subscription = apiService.getUser(someId)
    .flatMap(user -> apiService.getFavourites(user.getFavouritesTag())
    .subscribe(favourites -> view.updateFavouritesList(favourites), 
        throwable -> Log.e(TAG, throwable.printStackTrace());