如何以RxJava2方式组织异步调用链

如何以RxJava2方式组织异步调用链,java,android,asynchronous,rx-android,rx-java2,Java,Android,Asynchronous,Rx Android,Rx Java2,我将下一个代码包装在AsyncTask类中 AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { try { if (NetworkUtils.isNetworkCon

我将下一个代码包装在AsyncTask类中

        AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            try {
                if (NetworkUtils.isNetworkConnected(mContext))
                    mIndicatorTable.sync().blockingGet();
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            } finally {
                try {
                    final MobileServiceList<IndicatorModel> results = mIndicatorTable.table().read(null).blockingGet();
                    if (isViewAttached()) {
                        getMvpView().refreshIndicatorList(results);
                        getMvpView().hideLoading();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return null;
        };

RXJava通过调用使链接异步调用变得简单

mIndicatorTable.sync()
.flatMap(新函数(){
@凌驾
公共单源应用(布尔aBoolean)引发异常{
返回mIndicatorTable.table().read(null);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(…)

但是您希望在另一个线程中继续调用
sync()
,并且只能从主线程访问RecycleView。这就是rx android派上用场的地方
.subscribeOn(Schedulers.io())
在另一个线程中实例化流,并
.observeOn(AndroidSchedulers.mainThread())
确保此行下方的语句(此处,
.subscribe(…)
)在主线程中执行。

感谢您的解决方案。但是在这种情况下,
.sync
失败了,然后,
.read
从未执行过,我是对的?。在我的例子中,
.read
必须执行,而不考虑
.sync
结果(失败或成功)。在这种情况下,您可以在同步后捕获:由于
sync
是一个
单个
,也可能失败由
False
值表示,而不是错误。我使用了onErrorResumeNext来恢复执行流
getDataManager().syncAll()
     .onErrorResumeNext(Single.just(false))
     .flatMap(list -> toSingle(mIndicatorTable.getTable().read(null)))
     .subscribeOn(Schedulers.newThread())
     .observeOn(AndroidSchedulers.mainThread())
     .subscribe(results -> {
        if (isViewAttached()) {
            getMvpView().refreshIndicatorList(results);
            getMvpView().hideLoading();
        }
     })
mIndicatorTable.sync()
        .flatMap(new Function<Boolean, SingleSource<MobileServiceList<IndicatorModel>>>() {
            @Override
            public SingleSource<MobileServiceList<IndicatorModel>> apply(Boolean aBoolean) throws Exception {
                return mIndicatorTable.table().read(null);
            }
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(...)