我试图将一些基于侦听器模式的API包装到Observable。我的代码大致如下所示。
def myObservable = Observable.create({ aSubscriber ->
val listener = {event ->
aSubscriber.onNext(event);
}
existingEventSource.addListener(listener)
})
但是,当观察者调用subscription.unscribe()时,我希望我的observable立即从底层的existingEventSource中删除监听器。我怎么能实现这个目标呢?
答案 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
仍然订阅Subscriber
,Observable
就可以发出值。但是当Observable
未订阅时,它应该停止。但是,如果我们希望在Subscriber
取消订阅时收到通知,我们可以在发生时注册Subscriber
。这就是Action
方法的用途。正如@dwursteisen在评论中提到的那样;您基本上注册了一个在订阅者取消订阅时将执行的lambda。
也可以在不同的计划程序上取消订阅订阅。有关如何实现此目的的示例,请参阅add
项目中的MainThreadSubscription
。
以下是您如何使用它取消订阅主线程的示例
rxanroid