编程语言
首页 > 编程语言> > RxJava主题和错误处理

RxJava主题和错误处理

作者:互联网

我正在尝试实现类似于事件总线的行为.对于我的要求,似乎可以使用PublishSubject.

主题发出表示某些全局操作结果的项目,这些操作可能成功解决,或者在出现异常的情况下失败.在发生错误的情况下,我无法将onNext()用于成功事件,将onError()与Throwable一起使用,因为一旦调用onError(),该主题就会终止,并且除onError()之外,任何将来的订阅者都不会得到发射.

现在,按照我的观察方式,我必须创建一个表示事件的类,并在发生错误时有选择地引用Throwable.但是,这似乎是不明智的,因为必须处理onNext()内部的错误.

你会怎么做?

解决方法:

创建包装事件的通用类是一种方法.假设我们将其称为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以使Observable成为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());

现在您可以轻松地根据成功或失败来映射结果,甚至可以提供另一个Transformer返回映射的Observable< &而不是Observable< ResponseOrError< T>

标签:rx-java,rx-android,java,android
来源: https://codeday.me/bug/20191028/1949361.html