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

Gak*_*ket 22 java android onclicklistener rx-java2

我想Observable使用RxJava 2 创建一个来自视图的单击侦听器.我从最简单的实现开始(我不在这里使用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);
                    }
                }
            });
        }
    });
Run Code Online (Sandbox Code Playgroud)

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

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

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

aka*_*okd 25

来自Javadoc:

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

Disposable不是一个功能界面以及实现它的时候dispose()方法,你不能抛出checked异常.

相比之下,许多非RxJava组件返回一个CloseableAutoCloseable哪些是通过throws IOException并且throws Exception有些负担定义,因为你需要try-catch它.

例如,您希望在使用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();
});
Run Code Online (Sandbox Code Playgroud)

setDisposable如果你使用的话,你会使用Scheduler:

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

    eventSource.onEvent(es ->
        worker.schedule(() -> e.onNext(es))
    );
});
Run Code Online (Sandbox Code Playgroud)


Kis*_*kae 14

Cancellable最终得到包裹成Disposable所以最终的效果是对于任一呼叫相同.不同之处在于Disposable,您可能不希望实现更多功能,因此可以使用简单的Cancellable界面作为替代方案.

如果你只是想在可观察的结束使用时处理某些东西Cancellable.如果由于某些外部原因而需要处置资源Disposable以实现该Disposable.isDisposed()方法.

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

  • @IgorGanapolsky 例如,如果您正在侦听来自另一个系统的事件并且该系统广播它已经结束,您可以报告它已经被处理,而不是浪费时间取消注册事件。 (2认同)