Asnyc初始化RXJava BehaviorSubject

Flo*_*rth 5 java android rx-java

草图App结构

在我的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发出一些东西之前保持空白,然后将这个东西"推"给它的订阅者.

Glu*_*uck 1

感觉不对的是你使用了一个主题。在 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)