gpt4 book ai didi

java - RXJava BehaviorSubject 的 Asnyc 初始化

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:24:12 26 4
gpt4 key购买 nike

Sketch App Structure

在我的 Android 应用程序中,我使用 BehaviourSubject 从数据提供者“获取数据”到我的 UI 和其他需要数据的服务。举个例子,我们假设这些是给我们用户的消息。

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

这很好用,但是我在主题的初始化方面遇到了问题,或者换句话说,在应用程序启动时设置主题的初始值。

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

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

BehaviorSubject<Data> subject = BehaviorSubject.create();

getDataFromNetwork().subscribe(data -> subject.onNext(data));

其中 getDataFromNetwork() 返回网络调用结果的 Observable。

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

我在想这样的事情:BehaviorSubject.create(Observable obs) 或者在我的例子中是 BehaviourSubject.create(getDataFromNetwork()) 将设置主题,将其留空直到 Observable 发出一些东西,然后将此内容“推送”给其订阅者。

最佳答案

感觉不对的是你在使用主题。在 Rx 中,一般建议不要使用主题(尽可能多),你会惊讶于没有主题你能取得多少成就。

在您的情况下,您应该简单地公开一个可观察对象而不是主题:

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

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

如果要刷新查询,则switch是您可能需要的运算符(operator),例如假设 refreshObs 是一个在刷新时滴答作响的可观察对象:

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

关于java - RXJava BehaviorSubject 的 Asnyc 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33078464/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com