Как выполнять цепные задачи в RxJava? - PullRequest
2 голосов
/ 01 мая 2019

Я хочу выполнять задачи в RxJava один за другим.
Например: -
1. Получение идентификаторов пользователя с сервера
2. Получить пользователей с сервера по их идентификаторам.

Я пробовал этот метод

public Observable<List> getUids(){
       return Observable.create(emitter -> {
           List<String> uids = new ArrayList<>();
           //fetchData from server
            emitter.onNext(uids);

       });
}

public Observable<User> getUser(String uid){
       return Observable.create(emitter -> {
           User user = new User();
           //fetchData user from server
            emitter.onNext(user);
       });
}

//Executing this code like 

   getUids().flatMapIterable(ids -> ids)
               .flatMap(this::getUser)
               .subscribe(new Observer<User>() {
                 @Override
                 public void onSubscribe(Disposable d) {

                 }
                 @Override
                 public void onNext(User user) {
                   print("next "+user.getName());
                 }

                 @Override
                 public void onError(Throwable e) {
                   print("error "+e.getMessage());
                 }

                 @Override
                 public void onComplete() {
                   print("complete");
                 }
             });

В этом есть некоторые проблемы
1. это не вызывает метод onComplete() подписчика, когда все пользователи выбираются.
2.Если в методе getUser произошла ошибка, приложение перестало работать. с io.reactivex.exceptions.UndeliverableException исключением

Подскажите, пожалуйста, где я ошибаюсь?

1 Ответ

0 голосов
/ 01 мая 2019
  1. Вызовите emitter.onComplete() в ваших getUids() и getUser(...) Наблюдаемых, а затем добавьте .toList() после .flatMap(this::getUser).

    Возвращает сингл, который испускает одиночныйitem, список, состоящий из всех элементов, испускаемых конечным источником ObservableSource.

  2. UndeliverableException - это оболочка для исключения, которое происходит в вашем .flatMap(this::getUser).Я не могу помочь вам больше с информацией, которую вы предоставили, что вы хотите, чтобы произошло, когда выдается исключение?

...