我有一个Observable
我想要冷,也就是说,它应该只在第一个观察者订阅它时才开始发射物品。
然后,我想确保在所有观察者取消订阅同一个observable时从源中释放所有资源。这可能吗?
答案 0 :(得分:5)
您可以使用ConnectedObservable的功能为您处理此问题:
//Replace Observable.range(1,1000) with your Observable implementation
Observable.range(1, 1000).doOnUnsubscribe(() -> freeResources()).share();
share
方法调用方法publish
和refCount
。
publish
会改变您的正常情况"可观察到ConnectedObservable,它会在您调用connect
时开始发出项目。因此,您可以在技术上订阅任意数量的观察者,然后调用connect
同时开始为所有观察者发射项目。
refCount
将您的ConnectedObservable再次转换为传统的,但具有新特性!增加的好处是:这个observable现在很冷(只有在订阅者订阅时才开始发出,在内部调用用connect
创建的原始ConnectedObservable的publish
方法),并跟踪有多少订阅者连接到原始的ConnectedObservable。一旦所有订阅者都取消订阅,它将取消订阅源ConnectedObservable,因此逻辑变得更加简单,因为您只需要处理一个订阅。
这里有一个很好的共享操作图表:http://reactivex.io/RxJava/javadoc/rx/Observable.html#share()
或者,如果这不够灵活,我认为您应该能够使用defer
轻松实现此行为,以创建冷可观察对象,以及doOnSubscribe
和{{1}方法。
示例:
doOnUnsubscribe
这个observable将在第一个订阅者订阅后立即发出一系列数字(用您的可观察实现替换它),它将增加每个订阅的计数器,并在所有订阅者取消订阅后释放使用过的资源(替换freeResources,无论您需要什么)。