java - RXJava BehaviorSubject 的 Asnyc 初始化

标签 java android rx-java

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/

相关文章:

java - href 语句中的正斜杠 '/' 保持恢复为反斜杠 '\' .jnlp 文件

android - android有数字键盘吗?

rx-java - 我怎样才能有一个不会改变流的副作用订阅?

java - RxJava : Create items in list and return new list

java - 使用多线程 RxJava 的响应式(Reactive)拉取

java - 管理流使用期间的内存使用情况

java - 使用 @Body 的 Retrofit POST 请求返回空响应正文

java - 周期性写入数据时随机长IO暂停

android - 如何为多个屏幕设计 android cocos2d 应用程序

iphone - Android -> iPhone 之间的某种推送通信,中间没有服务器