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);
それらの違いは何ですか、どちらを使用する必要がありますか?
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))
);
});
Cancellable
はDisposable
にラップされるため、最終的な効果はどちらの呼び出しでも同じです。違いは、Disposable
には実装したくない機能があるため、単純なCancellable
インターフェースが代替手段として用意されていることです。
オブザーバブルが終了したときに何かを破棄する場合は、Cancellable
を使用します。何らかの外部的な理由で破棄される可能性のあるリソースがある場合は、Disposable
を実装してDisposable.isDisposed()
メソッドを実装する必要があります。
メソッドは相互に排他的であることに注意してください。一度に登録できる使い捨てまたはキャンセル可能なのは1つだけです。両方を呼び出すと、最初のものが上書きされます。