如何在RxJava中的自定义Observable中获得观察者取消订阅操作的通知

时间:2014-11-02 01:32:02

标签: observable rx-java

我试图将一些基于侦听器模式的API包装到Observable。我的代码大致如下所示。

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

但是,当观察者调用subscription.unscribe()时,我希望我的observable立即从底层的existingEventSource中删除监听器。我怎么能实现这个目标呢?

1 个答案:

答案 0 :(得分:29)

Subscriber抽象类实际上有一个方法add,可让您添加Subscription个订阅者将取消订阅。

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的{​​{1}};我们称之为Observable。只要Subscriber仍然订阅SubscriberObservable就可以发出值。但是当Observable未订阅时,它应该停止。但是,如果我们希望在Subscriber取消订阅时收到通知,我们可以在发生时注册Subscriber。这就是Action方法的用途。正如@dwursteisen在评论中提到的那样;您基本上注册了一个在订阅者取消订阅时将执行的lambda。

也可以在不同的计划程序上取消订阅订阅。有关如何实现此目的的示例,请参阅add项目中的MainThreadSubscription

以下是您如何使用它取消订阅主线程的示例

rxanroid