Mosby MVI - Как повторить попытку?

Я использую библиотеку Mosby MVI для демонстрационного приложения, которое выполняет простые операции CRUD в Restful API, используя Retrofit2 в моем Interactor. Я создал ViewStates, очень похожий на пример приложения, содержащий Throwable, когда Retrofit отвечает с ошибкой. В этом случае функция render() отображает экран ошибки с кнопкой повторной попытки. Когда нажата кнопка повторной попытки, я хочу повторно передать последний элемент для намерения, которое не удалось.

Я хотел бы добавить что-то вроде retryWhen() в намерение, которое, конечно, запускается только onError().

Есть ли простой способ добавить такое поведение?


person TobiasRe    schedule 20.02.2017    source источник


Ответы (1)


На самом деле я сам решил проблему, используя combineLatest(). retrySubject не нужно знать содержимое предыдущего намерения.

class MyViewActivity extends MviActivity<MyView, MyViewState> implements MyView {
  PublishSubject<Boolean> retrySubject =  ... ; // fires on retry Button click
  ...

  @Override
  public Observable<String> searchIntent(){
    Observable<String> searchObservable =   RxSearchView.queryTextChanges(searchView);
    return Observable.combineLatest(searchObservable,retrySubject(searchString, retryClicked) -> searchString);
  }
}

Есть одно замечание. combLatest() выдает элементы только тогда, когда все Observable выдают первый элемент после подписки на них. Вот почему мне нужно инициализировать повторную попытку после того, как Mosby сделал свои подписки.

@Override
  protected void onStart() {
    super.onStart();
    retrySubject.onNext(true);
}

Также просмотрите ответ @sockeqwe на Github.

person TobiasRe    schedule 20.02.2017