与RxJava中EventBus中的getStickyEvent()等效。

我想订阅不在“屏幕”中的可观察对象
前景/未激活,但随时可能会弹出。

如果事件持续发生,我希望这些“屏幕”在下一次收到
他们是活跃的/在前台。

编辑:

听起来我应该有一个replaySubject,然后在“屏幕”出现时
到前台订阅它.....?

  BehaviorSubject – emits the last emitted item when subscribed to,
  then continues to emit items from the source observable

最佳答案

您已经自己给出了答案,但只是为了确认:是的,您将使用BehaviorSubject或ReplaySubject。

新订户订阅后,他们都将向此订户发出从此以后收到的所有项目。但是,每个人都具有一些额外的功能:


BehaviorSubject将始终通过立即发出在订阅者订阅之前已收到的(一个)最新项来开始该序列。如果没有,它将在创建时提供默认项时发出默认项。
ReplaySubject将始终通过立即按接收顺序发出(创建后自其创建后已取消的所有所有内容)开始该序列。可以初始化ReplaySubject来限制它保留在缓存中供以后使用的子项的数量,或者限制它将项目保留在缓存中的时间。但是(据我所知),如果使用ReplaySubject,则无法提供默认值。


然后,打电话

subject.subscribe(new Subscriber<YourEventClass>() {
    // implement Subscriber methods here
});


或多或少等于:

eventbus.registerSticky(this);


并让this实现EventBus的回调。

同步与异步

但是请注意,这样的订阅仍然使从主题传递项目是异步的(例如register / registerSticky),因为在两种情况下,您都仅移交了一些回调方法,而没有在那里等待返回的结果。

我本人还没有使用过greenrobot EventBus,但似乎getStickyEvent()是同步/阻塞的。

如果要阻止行为,则必须(而不是订阅)将主题转换为可观察到的阻止对象(使用subject.toBlocking())。

有关阻止可观察对象的更多信息,请参见此处:

https://github.com/ReactiveX/RxJava/wiki/Blocking-Observable-Operators

但基本上您可以将它们转换为可迭代的对象,或者仅获取最新的东西,或者其他一些东西。

07-27 15:26