gpt4 book ai didi

java - RxJava 2 Cancellable 和 Disposable 有什么区别?

转载 作者:IT老高 更新时间:2023-10-28 20:51:17 27 4
gpt4 key购买 nike

我想使用 RxJava 2 从 View 点击监听器创建一个 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);

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

最佳答案

来自 Javadoc :

[Cancellable is] A functional interface that has a single cancel method that can throw.

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

相比之下,许多非 RxJava 组件返回一个 CloseableAutoCloseable,它们是通过 throws IOExceptionthrows 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();
});

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

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

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

关于java - RxJava 2 Cancellable 和 Disposable 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43280248/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com