RxJava 2 可取消和一次性之间的区别是什么?

2022-09-01 20:23:24

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

 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);
                    }
                }
            });
        }
    });

然后,我考虑了在不需要进一步时将其设置为 null 的方法。我发现有两种方法具有相似的(与我一样)名称:onClickListener

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

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


答案 1

来自 Javadoc

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

它不是一个功能接口,而且在实现其方法时,不允许抛出已检查的异常。Disposabledispose()

相比之下,许多非 RxJava 组件返回通过 和 定义的 or,并且在某种程度上是负担,因为您需要尝试捕获它。CloseableAutoCloseablethrows IOExceptionthrows Exception

例如,您希望在处理文件时使用: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();
});

如果您使用 :setDisposableScheduler

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

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

答案 2

最终被包装成,因此任何一个调用的最终效果都是相同的。不同之处在于,它具有更多您可能不想实现的功能,因此简单接口是替代方法。CancellableDisposableDisposableCancellable

如果您只想在可观察性结束时处理某些内容,请使用 .如果您有一个资源,由于某些外部原因可能被释放,则您希望实现该方法。CancellableDisposableDisposable.isDisposed()

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


推荐