如何以RxJava2方式组织异步调用链
我将下一个代码包装在AsyncTask类中如何以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<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(...)