From the Javadoc:
[Cancellable
is] A functional interface that has a single cancel method that can throw.
The Disposable
is not a functional interface plus when implementing its dispose()
method, you are not allowed to throw checked exceptions.
In contrast, many non-RxJava components return a Closeable
or AutoCloseable
which are defined via throws IOException
and throws Exception
and are somewhat of a burden because you'd need try-catch it.
For example, you'd want to use setCancellable
when you work with a file:
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();
});
and you'd use setDisposable
if you use a Scheduler
:
Observable.create((ObservableEmitter<Event> e) -> {
Worker worker = Schedulers.io().createWorker();
e.setDisposable(worker);
eventSource.onEvent(es ->
worker.schedule(() -> e.onNext(es))
);
});
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…