リスナーパターンベースのAPIをObservableにラップしようとしています。私のコードはおおまかに次のようになります。
def myObservable = Observable.create({ aSubscriber ->
val listener = {event ->
aSubscriber.onNext(event);
}
existingEventSource.addListener(listener)
})
ただし、オブザーバブルがsubscription.unscribe()を呼び出すと、基礎となるexistingEventSourceからリスナーをすぐに削除する必要があります。どうすればこの目標を達成できますか?
Subscriber
抽象クラスには実際にはメソッドadd
があり、これを使用すると、サブスクライバーでサブスクライブ解除されるSubscription
sを追加できます。
def myObservable = Observable.create({ aSubscriber ->
val listener = {event ->
aSubscriber.onNext(event);
}
existingEventSource.addListener(listener)
// Adds a lambda to be executed when the Subscriber un-subscribes from your Observable
aSubscriber.add(Subscriptions.create(() -> existingEventSource.removeListener(listener)));
})
aSubscriber
をObserver
にサブスクライブしたObservable
と考えてください。これをSubscriber
と呼びます。 Subscriber
がまだObservable
にサブスクライブされている限り、Observable
は値を発行できます。しかし、そのSubscriber
がサブスクライブ解除されると、停止するはずです。ただし、Subscriber
のサブスクライブ解除時に通知を受け取りたい場合は、Action
が発生したときに実行するように登録できます。これは、add
メソッドが使用される目的です。コメントで@dwursteisenが述べたように;基本的に、サブスクライバーがサブスクライブを解除したときに実行されるラムダを登録します。
別のスケジューラでサブスクリプションのサブスクリプションを解除することもできます。これを実現する方法の例については、MainThreadSubscription
プロジェクトの rxanroid
を参照してください。
メインスレッドの購読を解除するためにそれを使用する方法の例を次に示します
aSubscriber.add(new MainThreadSubscription() {
@Override
protected void onUnsubscribe() {
existingEventSource.removeListener(listener);
}
});