Flo*_*rth 5 java android rx-java
在我的Android应用程序中,我使用BehaviourSubject"从数据提供者获取数据"到我的UI和需要数据的其他服务.为了举例,我们假设这些是我们用户的消息.
每当触发数据刷新(例如消息)时,数据提供者将进行"长时间运行"(又称"慢速")网络呼叫以检索消息并通过调用主体的onNext(data)操作将其馈送到主题中,从而"广播" UI和其他订阅者的更新.
这很好用,但是我对主题的初始化有问题,或者在应用程序启动时设置主题的初始值时采用另一种方式.
我知道我可以通过设置初始值BehaviorSubject.create(initialValue),但由于initialValue是网络调用的结果,这将阻止主题的初始化.
我目前在我的数据提供程序的init中执行以下操作:
BehaviorSubject<Data> subject = BehaviorSubject.create();
getDataFromNetwork().subscribe(data -> subject.onNext(data));
Run Code Online (Sandbox Code Playgroud)
其中getDataFromNetwork()返回网络调用结果的Observable.
问题: 上面的构造将手动刷新的可观察到的行为连接到BehaviourSubject,感觉错误 /不优雅.有没有更好的方法用另一个Observable初始化BehaviourSubject?
我想的是:
BehaviorSubject.create(Observable obs)或者在我的情况下BehaviourSubject.create(getDataFromNetwork())设置主题,在Observable发出一些东西之前保持空白,然后将这个东西"推"给它的订阅者.
感觉不对的是你使用了一个主题。在 Rx 中,一般建议不要使用主题(尽可能多),并且您会惊讶地发现不使用主题您可以取得多少成果。
在你的情况下,你应该简单地暴露一个可观察的而不是主题:
Observable<Data> cachedData = getDataFromNetwork().publish().replay(1);
Run Code Online (Sandbox Code Playgroud)
它的工作方式与您试图欺骗的方式相同BehaviorSubject,但完全是 Rx。
如果您想刷新查询,那么switch是您可能需要的运算符,例如假设refreshObs是一个在刷新时勾选的可观察对象:
Observable<Data> cachedData = refreshObs.map(t -> getDataFromNetwork())
.switchOnNext()
.publish().replay(1);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
344 次 |
| 最近记录: |