У меня есть следующий код, завернутый в AsyncTask классеКак организовать цепочку асинхронных вызовов в RxJava2 пути
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();
}
})
Благодарим за решение. Но в этом случае '.sync' не удалось, поэтому' .read' никогда не выполнялся, я прав ?. В моем случае '.read' должен быть выполнен независимо от результата .sync (неудачно или успешно) –
В этом случае вы можете поймать после синхронизации: http://reactivex.io/documentation/operators/catch.html –
Поскольку' sync' является 'Single', также возможно, что отказ представлен значением 'False', а не ошибкой. –