我想创建一个可观察的对象,该对象仅在它的订阅者正在收听时才会发出项目。可以随时添加和/或处置用户,如果没有用户连接之前又有新的连接,则可能会有很长的延迟。 我认为可行的一种可能方法是:
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函数的方式感觉很奇怪,我想知道它是否是线程安全的吗?
有人能推荐一个更好的解决方案吗?
答案 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()以及如何调用可观察的