2015-07-29 13 views
3

Я пытаюсь добиться такого же поведения, как и для шины событий. Для моих требований подходит PublishSubject.Объекты RxJava и обработка ошибок

Объект испускает элементы, представляющие результат некоторой глобальной операции, которая может успешно разрешаться или сбой в случае исключения. Я не могу использовать onNext() для успешных событий и onError() с Throwable в случае ошибки, так как однажды вызывается onError(), тема прекращается, и любые будущие подписчики не получат никаких выбросов, кроме onError().

Прямо сейчас, как я его вижу Я должен создать класс, представляющий событие, и, при необходимости, ссылаясь на Throwable в случае ошибки. Это, однако, кажется неразумным, так как нужно было бы обрабатывать ошибки внутри onNext().

Как вы относитесь к этому?

ответ

4

Создание общих событий переноса классов - это путь. Скажем, мы называем это ResponseOrError класса, он должен в основном содержать два поля

private T data; 
private Throwable error; 

и два простых фабричных методов:

public static <T> ResponseOrError<T> fromError(Throwable throwable) { 
    return new ResponseOrError<>(throwable); 
} 

public static <T> ResponseOrError<T> fromData(T data) { 
    return new ResponseOrError<>(data); 
} 

удалить некоторые шаблонный код, который вы можете предоставить Transformer сделать Наблюдаемый типа ResponseOrError ,

public static <T> Observable.Transformer<T, ResponseOrError<T>> toResponseOrErrorObservable() { 
    return new Observable.Transformer<T, ResponseOrError<T>>() { 

     @Override 
     public Observable<ResponseOrError<T>> call(final Observable<T> observable) { 
      return observable 
        .map(new Func1<T, ResponseOrError<T>>() { 
         @Override 
         public ResponseOrError<T> call(final T t) { 
          return ResponseOrError.fromData(t); 
         } 
        }) 
        .onErrorResumeNext(new Func1<Throwable, Observable<? extends ResponseOrError<T>>>() { 
         @Override 
         public Observable<? extends ResponseOrError<T>> call(final Throwable throwable) { 
          return Observable.just(ResponseOrError.<T>fromError(throwable)); 
         } 
        }); 
     } 
    }; 
} 

, то вы можете использовать его так:

final Observable<ResponseOrError<ImportantData>> compose = mNetworkService 
       .getImportantData() 
       .compose(ResponseOrError.<ImportantData>toResponseOrErrorObservable()); 

и теперь вы можете легко отобразить результат в зависимости от успеха или неудачи или даже предоставить другой трансформатор возвращения сопоставляются Наблюдаемые < T> вместо от Наблюдаемый < ResponseOrError < T >>

+0

Это потрясающе, tha НКС! – woot

+0

Я не знал о 'compose()' и 'Transformer', прежде чем вы разместили это, но на самом деле есть встроенный тип для вашего типа ResponseOrError, называемого« Notification », который, как считается, стоит упомянуть. – woot

Смежные вопросы