如何创建可在订阅时激活的多播可观察对象?

时间:2018-06-24 20:18:54

标签: rx-java2

我想融合几个Android传感器的输入,并将输出公开为可观察的(或至少可以订阅的东西),以支持多个同时观察者。解决这个问题的惯用方式是什么?标准库中是否有一个可以作为良好起点的类?

我当时正在考虑将PublishSubject包装在一个对象中,该对象具有一个或多个subscribe测试方法hasObservers来激活传感器的委托,并包装返回的Disposable在测试hasObservers以停用它们的代理中。像这样的东西,尽管这已经有一些明显的问题:

public class SensorSubject<T> {
    private final PublishSubject<T> mSubject = PublishSubject.create();

    public Disposable subscribe(final Consumer<? super T> consumer) {
        final Disposable d = mSubject.subscribe(consumer);
        if(mSubject.hasObservers()) {
            // activate sensors
        }
        return new Disposable() {
            @Override
            public void dispose() {
                // possible race conditions!
                if(!isDisposed()) {
                    d.dispose();
                    if(!mSubject.hasObservers()) {
                        // deactivate sensors
                    }
                }
            }

            @Override
            public boolean isDisposed() {
                return d.isDisposed();
            }
        };
    }
}

1 个答案:

答案 0 :(得分:1)

在RxJava中,惯用的方法是使用可热观测

冷的可观察物在有人订阅它们并将所有项目发送给该订阅者时执行某些操作。因此,这是一对一的关系。

热可观察进行一些操作,并根据各个订阅独立发出项目。因此,如果您订阅得太晚,则可能无法获得较早发出的某些值。这是一对多的关系,也就是多播-这就是您想要的。

通常的方法是进行cbPerm.selectedProperty().bind(parent.selectedProperty()); 多播的Flowable.publish(),但是需要调用connect()方法来开始发出值。

根据您的情况,您还可以调用refCount()来添加所需的功能-至少有一个订阅时,它订阅源Flowable,而当每个人都不订阅时,它订阅订阅。

因为Flowable是非常流行的组合,所以它们有一个捷径- share() 。据我了解,这正是您想要的。

由asker编辑:该代码以Dagger 2提供程序方法的形式结合了此答案和David Karnok的评论。 publish().refCount()来自EJML。这似乎可以满足我的要求。

SimpleMatrix