可观察到的只有在订阅时才会发出

时间:2018-06-26 16:17:28

标签: rx-java rx-java2

我想创建一个可观察的对象,该对象仅在它的订阅者正在收听时才会发出项目。可以随时添加和/或处置用户,如果没有用户连接之前又有新的连接,则可能会有很长的延迟。 我认为可行的一种可能方法是:

observable = Observable.defer(new Callable<ObservableSource<Long>>() {
        @Override
        public ObservableSource<Long> call() throws Exception {
            final AtomicInteger counter = new AtomicInteger();

            return Observable.create(new ObservableOnSubscribe<Long>() {

                @Override
                public void subscribe(ObservableEmitter<Long> e) throws Exception {
                    emitter = e;
                }
            }).doOnSubscribe(new Consumer<Disposable>() {
                @Override
                public void accept(Disposable disposable) throws Exception {
                    counter.incrementAndGet();
                    startEmitting(emitter);
                }
            }).doOnDispose(new Action() {
                @Override
                public void run() throws Exception {
                    if (counter.decrementAndGet() == 0) {
                        stopEmitting(emitter);
                    }
                }
            });
        }
    });

此解决方案可能会起作用,但是Observable永远无法完成。那是问题吗? 完成stopEmitting功能后,我想我下次有人要订阅时必须创建一个新的观察者吗? 另外,我需要将发射器传递给onSubscribe或onDispose函数的方式感觉很奇怪,我想知道它是否是线程安全的吗?

有人能推荐一个更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我对rx-java2不太了解,但是我对可观察模式有一些建议。

您也许可以创建一个名为ObservableEmitter的对象。在此类中,您可以创建一个类似subscribe(订阅者订户)的方法和一个方法emit()。

然后由您的订户实现订户接口。我将调用方法receive(Message message)。

在代码中看起来像这样:

public interface Subscriber {
  void receive(Message msg);
}

public class ObservableEmitter {
 private List<Subscriber> subscribers = new ArrayList<Subscriber>();
 public subscribe(Subscriber sub) {
  subscribers.add(sub);
 }
 public void emit(Message msg) {
   for(Subscriber sub : subscribers) {
     sub.receive(msg);
   }
 }
}

这样,仅当有订阅者时,您才发出消息。您的最小示例中缺少一些代码:startEmitting()以及如何调用可观察的