У меня есть следующий код, завернутый в класс 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?
#ОБНОВЛЕНИЕ
Рабочая версия
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();
}
})