是否有一个只能传播错误而不会终止自身的可观察对象?

时间:2015-03-02 17:31:56

标签: java android rx-java

我在负责同步的类中使用PublishSubject。完成同步后,将通知所有订户。如果出现错误,也会发生同样的情况。 我注意到下次订阅错误后,我会立即返回订阅者。

所以课程可能如下所示:

public class Synchronizer {
private final PublishSubject<Result> mSyncHeadObservable = PublishSubject.create();
    private final ThreadPoolExecutor mExecutor = new ThreadPoolExecutor(1, 1,
            10, TimeUnit.SECONDS,
            new SynchronousQueue<Runnable>(true),
            new ThreadPoolExecutor.DiscardPolicy());


    public Observable<Result> syncHead(final int chunkSize) {
              mExecutor.execute(new Runnable() {
      @Override
      public void run() {
          try {
              //Do some work which either returns a result or throws an error
              //...

              mSyncHeadObservable.onNext(Notification.createOnNext(/*some result*/));
          } catch (Throwable error) {
              mSyncHeadObservable.onError(Notification.<Result>createOnError(error));
          }
      }
  });

是否有一个可以作为代理人的观察者?可能是其他一些Rx方法吗?

更新: 我已经跟随@akarnokd方法并发出包含在RxJava Notification中的事件。然后通过flatMap()打开它们。因此Synchronizer类的客户不需要这样做。

    //...
private PublishSubject<Notification<Result>> mSyncHeadObservable = PublishSubject.create();

      public Observable<Result> syncHead(final int chunkSize) {

          return mSyncHeadObservable.flatMap(new Func1<Notification<Result>, Observable<Result>>() {
            @Override
            public Observable<Result> call(Notification<Result> result) {
                if (result.isOnError()) {
                    return Observable.error(result.getThrowable());
                }

                return Observable.just(result.getValue());
            }
        }).doOnSubscribe(
            new Action0() {
                @Override
                public void call() {
                    startHeadSync(chunkSize);
                }
            });
      }

      private void startHeadSync(final int chunkSize) {
          mExecutor.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    //Do some work which either returns a result or throws an error
                    //...

                    mSyncHeadObservable.onNext(Notification.createOnNext(/*some result*/));
                } catch (Throwable error) {
                    mSyncHeadObservable.onError(Notification.<Result>createOnError(error));
                }
            }
          });
       }
  //...

2 个答案:

答案 0 :(得分:1)

我不确定您希望通过此设置实现什么,但通常,为了避免使用PublishSubject的终端条件,您应该将值和错误包装到一个公共结构中并始终发出这些,从来没有任何onErroronCompleted。一种选择是使用RxJava自己的事件包装器Notification,并且您的Subscriber应该解包该值。

答案 1 :(得分:0)

发生错误时,observable达到终端状态。

如果您想继续观察它,您应该使用重试操作符重新订阅您,或使用其他错误handling operators