web-dev-qa-db-ja.com

RxJavaのカスタムObservableでオブザーバーのサブスクライブ解除アクションの通知を受け取る方法

リスナーパターンベースのAPIをObservableにラップしようとしています。私のコードはおおまかに次のようになります。

def myObservable = Observable.create({ aSubscriber ->
    val listener = {event -> 
      aSubscriber.onNext(event);                
    }
    existingEventSource.addListener(listener)
})

ただし、オブザーバブルがsubscription.unscribe()を呼び出すと、基礎となるexistingEventSourceからリスナーをすぐに削除する必要があります。どうすればこの目標を達成できますか?

18
victorx

Subscriber抽象クラスには実際にはメソッドaddがあり、これを使用すると、サブスクライバーでサブスクライブ解除されるSubscriptionsを追加できます。

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)));
})

aSubscriberObserverにサブスクライブしたObservableと考えてください。これをSubscriberと呼びます。 SubscriberがまだObservableにサブスクライブされている限り、Observableは値を発行できます。しかし、そのSubscriberがサブスクライブ解除されると、停止するはずです。ただし、Subscriberのサブスクライブ解除時に通知を受け取りたい場合は、Actionが発生したときに実行するように登録できます。これは、addメソッドが使用される目的です。コメントで@dwursteisenが述べたように;基本的に、サブスクライバーがサブスクライブを解除したときに実行されるラムダを登録します。

別のスケジューラでサブスクリプションのサブスクリプションを解除することもできます。これを実現する方法の例については、MainThreadSubscriptionプロジェクトの rxanroid を参照してください。

メインスレッドの購読を解除するためにそれを使用する方法の例を次に示します

aSubscriber.add(new MainThreadSubscription() {
    @Override
    protected void onUnsubscribe() {
        existingEventSource.removeListener(listener);
    }
});
29
Miguel Lavigne