RxJava 2可取消和一次性有什么区别?

时间:2017-04-07 14:09:39

标签: java android onclicklistener rx-java2

我想使用RxJava 2从视图点击监听器创建Observable。我从最简单的实现开始(我不在这里使用lambdas来向您展示此方法中的不同类型):

 Observable<View> viewObservable = Observable.create(new ObservableOnSubscribe<View>() {
        @Override
        public void subscribe(@NonNull ObservableEmitter<View> e) throws Exception {
            mNewWordView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View value) {
                    if (!e.isDisposed()) {
                        e.onNext(value);
                    }
                }
            });
        }
    });

然后我想到了如果不需要进一步将onClickListener设置为null的方法。我发现有两种类似(对我来说)名称的方法:

e.setCancellable(Cancellable c);和                         e.setDisposable(Disposable d);

它们之间有什么区别,我应该使用哪种?

2 个答案:

答案 0 :(得分:23)

来自Javadoc

  

[Cancellable是]一个功能接口,它有一个可以抛出的取消方法。

Disposable不是函数接口加上实现其dispose()方法时,不允许抛出已检查的异常。

相比之下,许多非RxJava组件返回CloseableAutoCloseable,这些组件是通过throws IOExceptionthrows Exception定义的,并且有点负担,因为您有&#39;需要尝试抓住它。

例如,您在处理文件时想要使用setCancellable

Observable.create((ObservableEmitter<byte[]> e) -> {
    FileInputStream fin = new FileInputStream("raw.dat");
    e.setCancellable(fin::close);

    byte[] buffer = new byte[4096];

    for (;;) {
        int r = fin.read(buffer);
        if (r < 0) {
            break;
        }
        e.onNext(buffer);
    }
    e.onComplete();
});

如果您使用setDisposable,则可以使用Scheduler

Observable.create((ObservableEmitter<Event> e) -> {
    Worker worker = Schedulers.io().createWorker();
    e.setDisposable(worker);

    eventSource.onEvent(es ->
        worker.schedule(() -> e.onNext(es))
    );
});

答案 1 :(得分:12)

Cancellable最终被包裹到Disposable中,因此对于任一调用,最终效果都相同。不同之处在于Disposable具有您可能不想实现的更多功能,因此可以使用简单的Cancellable接口作为替代。

如果您只想在可观察结束时使用Cancellable处置某些内容。如果您有资源可能因某些外部原因而被处置,那么您希望实施Disposable来实施Disposable.isDisposed()方法。

请注意,这些方法是互斥的。一次只能登记一次性或可取消的。调用两者都会覆盖第一个。