[英]What is the difference between Observable and Flowable in RxJava 2.0?
[英]What is the difference between RxJava 2 Cancellable and Disposable?
我想使用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);
它們之間有什么區別,我應該使用哪種?
來自Javadoc :
[
Cancellable
是],其具有單一的功能性接口取消方法,該方法可以拋出。
Disposable
不是一個功能接口加上實現其dispose()
方法時,不允許拋出已檢查的異常。
相反,許多非RxJava組件返回一個Closeable
或AutoCloseable
,它們通過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();
});
如果您使用Scheduler
則使用setDisposable
:
Observable.create((ObservableEmitter<Event> e) -> {
Worker worker = Schedulers.io().createWorker();
e.setDisposable(worker);
eventSource.onEvent(es ->
worker.schedule(() -> e.onNext(es))
);
});
Cancellable
最終被包裝到Disposable
因此對於任一調用,最終效果都是相同的。 不同之處在於Disposable
具有您可能不想實現的更多功能,因此可以使用簡單的Cancellable
接口作為替代方案。
如果你只是想在可觀察的結尾使用Cancellable
時處置某些東西。 如果由於某些外部原因而有可能被處置的資源,則需要實現Disposable
以實現Disposable.isDisposed()
方法。
請注意,這些方法是互斥的。 一次只能登記一次性或可取消的。 調用兩者都會覆蓋第一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.