2017-02-21 12 views
1

У меня есть следующий код, завернутый в 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(); 
     } 
    }) 

ответ

1

ой-ява грим цепочки асинхронного вызов легко, просто позвонив .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(...)).

+0

Благодарим за решение. Но в этом случае '.sync' не удалось, поэтому' .read' никогда не выполнялся, я прав ?. В моем случае '.read' должен быть выполнен независимо от результата .sync (неудачно или успешно) –

+0

В этом случае вы можете поймать после синхронизации: http://reactivex.io/documentation/operators/catch.html –

+0

Поскольку' sync' является 'Single ', также возможно, что отказ представлен значением 'False', а не ошибкой. –