簡體   English   中英

RxJava 2可取消和一次性有什么區別?

[英]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組件返回一個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();
});

如果您使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM