我有下一个代码包装在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;
};
mIndicatorTable.sync()
和mIndicatorTable.table().read(null)
都返回Single<Boolean>
。 mIndicatorTable.sync()
- 将本地存储与远程存储同步,如果网络不可用,那么我们只需在网络准备就绪时使用mIndicatorTable.table().read(null)
从本地存储中读取 - 我们执行同步,然后从本地存储中读取(我们不会如果同步被取消或中断,请小心)。毕竟我们应该调用View来刷新RecycleView。如何使用RxJava2实现它?
#UPDATE
工作版
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();
}
})
答案 0 :(得分:1)
rx-java只需调用.flatMap()即可轻松实现链接异步调用。
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(...)
但是你想在另一个线程中进行sync()
调用,只能从主线程访问RecycleView。这就是rx-android派上用场的地方。 .subscribeOn(Schedulers.io())
在另一个线程中实例化流,.observeOn(AndroidSchedulers.mainThread())
确保在主线程中执行此行下面的语句(此处为.subscribe(...)
)。