在我的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发出内容之前将其留空,然后将此内容“推送”给订阅者。
答案 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);