web-dev-qa-db-ja.com

RxJava 2 CancellableとDisposableの違いは何ですか?

RxJava 2を使用して、ビュークリックリスナから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);
                    }
                }
            });
        }
    });
_

それから、onClickListenerがそれ以上必要でない場合にnullに設定する方法を考えました。私は似たような名前のメソッドが2つあることがわかりました。

e.setCancellable(Cancellable c);およびe.setDisposable(Disposable d);

それらの違いは何ですか、どちらを使用する必要がありますか?

21
Gaket

Javadoc から:

[Cancellable is]スローできる単一のキャンセルメソッドを持つ機能インターフェイス。

Disposableは機能的なインターフェースではありません。そのdispose()メソッドを実装する場合、チェック済み例外をスローすることはできません。

対照的に、多くの非RxJavaコンポーネントは、throws IOExceptionおよびthrows Exceptionを介して定義されるCloseableまたはAutoCloseableを返します。 -捕まえろ。

たとえば、ファイルを操作するときに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();
});

setDisposableを使用する場合は、Schedulerを使用します。

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

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

CancellableDisposableにラップされるため、最終的な効果はどちらの呼び出しでも同じです。違いは、Disposableには実装したくない機能があるため、単純なCancellableインターフェースが代替手段として用意されていることです。

オブザーバブルが終了したときに何かを破棄する場合は、Cancellableを使用します。何らかの外部的な理由で破棄される可能性のあるリソースがある場合は、Disposableを実装してDisposable.isDisposed()メソッドを実装する必要があります。

メソッドは相互に排他的であることに注意してください。一度に登録できる使い捨てまたはキャンセル可能なのは1つだけです。両方を呼び出すと、最初のものが上書きされます。

14
Kiskae