我一直在尝试找到一种优雅的方法来做到这一点,但到目前为止还没有成功。我曾多次想要为此设计一个设计模式,但一直没有找到足够的东西。
这是一个用例:在 Android 中,您可以获得 GPS 位置更新。不过,保持 GPS 开启的成本很高。运行 GPS 的成本很高,尤其是当您不执行任何位置更新操作时。我想要一个可以有多个订阅的主题/可观察对象,当它获得 1 个订阅时,它会获取并保持 GPS 开启并开始流式传输位置更新。当所有订阅都被取消订阅时,它就会关闭 GPS。
完成这种一般行为的良好模式是什么?
最佳答案
您也许可以使用 share
运算符,它本质上相当于 publish().refcount()
。我还没有测试以确保它可以恢复,但代码似乎表明它可以。基本上,当有一个订阅者时,它会“连接”以启动输出,而该订阅者仅由一个订阅支持。同时,它对任何其他子订阅者进行引用计数,当该值降至零时,它会取消订阅后备订阅。这意味着您可以在调用 share
运算符之前 Hook onSubscribe/onUnsubscribe,并使用 GPS 或任何其他需要泵送数据的设备执行您需要的操作。前面的伪Java:
public class GPSLocationManager {
private final Observable<Location> locations;
public GPSLocationManager() {
locations = getMagicalGPSLocationObservable()
.doOnSubscribe(() -> turnOnGps())
.doOnUnsubscribe(() -> turnOffGps())
.share();
}
public Observable<Location> getLocations() {
return locations;
}
}
就像我说的,悬而未决的问号似乎是,当你下降到0后,你是否可以重新启动连接。我相信答案是肯定的,但我并不肯定。
关于java - 一个主题的多个订阅者。有订阅时打开,否则关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27701682/