java - 一个主题的多个订阅者。有订阅时打开,否则关闭

标签 java rx-java

我一直在尝试找到一种优雅的方法来做到这一点,但到目前为止还没有成功。我曾多次想要为此设计一个设计模式,但一直没有找到足够的东西。

这是一个用例:在 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/

相关文章:

android - 使用 Retrofit 和 RX-java 处理无网络的正确方法

java - unSubscribeOn 调用了哪个线程?我们应该调用它吗?

java - Spring ,AOP,AspectJ :- is there a way to find out which method caused call to "beforeAdvice" and "afterAdvice"

java - 如何在没有 EventListener 的情况下从 Firebase 检索数据?

java - 从 Java Access 数据库的时间很长

java - RxJava - 观察可能总是变化的数据

java - Struts 2 + Spring 在 session 中放置一个托管的 spring bean

java - 使用参数运行我的 jar 时出错

android - RxAndroid 一个接一个地调用网络调用

java - 关于Rxjava的一些概念: Observer pattern, and event