Asnyc初始化RXJava BehaviorSubject

时间:2015-10-12 10:06:55

标签: java android rx-java

Sketch App Structure

在我的Android App中,我使用BehaviourSubject“从数据提供者那里获取数据”到我的UI以及需要数据的其他服务。为了举例,我们假设这些是我们用户的消息。

每当触发数据刷新(例如消息)时,数据提供者将执行“长时间运行”(又称“慢速”)网络调用以检索消息并通过调用主题{{1}将其提供给主题操作,从而“广播”UI和其他订阅者的更新。

这很有效,但是我对主题的初始化有问题,或者在应用开始时设置主题的初始值时采用另一种方式。

我知道我可以通过onNext(data)设置初始值,但由于 initialValue 是网络调用的结果,这会阻止主题的初始化。

我目前在数据提供程序的init中执行以下操作:

BehaviorSubject.create(initialValue)

其中BehaviorSubject<Data> subject = BehaviorSubject.create(); getDataFromNetwork().subscribe(data -> subject.onNext(data)); 返回网络调用结果的Observable。

问题: 上面的构造将从网络刷新的可观察到的行为连接到BehaviourSubject,感觉错误 /不优雅。是否有更好的方法用另一个Observable初始化BehaviourSubject?

我在想类似的事情: getDataFromNetwork()或在我的情况下BehaviorSubject.create(Observable obs)设置主题,在Observable发出内容之前将其留空,然后将此内容“推送”给订阅者。

1 个答案:

答案 0 :(得分:0)

感觉错误的原因是您正在使用某个主题。在Rx中,一般建议不要使用主题(尽可能多),你会惊讶地发现你可以实现多少。

在你的情况下,你应该只是公开一个observable而不是主题:

Observable<Data> cachedData = getDataFromNetwork().publish().replay(1);

它的工作方式与您尝试欺骗BehaviorSubject的方式相同,但完全是Rx。

如果要刷新查询,则switch是您可能需要的运算符,例如假设refreshObs是一个可以在刷新时打勾的可观察对象:

Observable<Data> cachedData = refreshObs.map(t -> getDataFromNetwork())
                                        .switchOnNext()
                                        .publish().replay(1);