Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RXJava行为主体的Asnyc初始化_Java_Android_Rx Java - Fatal编程技术网

RXJava行为主体的Asnyc初始化

RXJava行为主体的Asnyc初始化,java,android,rx-java,Java,Android,Rx Java,在我的Android应用程序中,我使用一个行为主题“获取数据”,从数据提供商到我的UI和其他需要数据的服务。作为示例,让我们假设这些是针对用户的消息 每当触发数据(例如消息)刷新时,数据提供者将执行“长时间运行”(也称为“慢速”)网络调用,以检索消息,并通过调用主题的onNext(data)操作将其输入主题,从而将更新“广播”到UI和其他订阅者 这工作得很好,但我对主题的初始化有问题,或者用另一种方式在应用程序启动时设置主题的初始值 我知道我可以通过BehaviorSubject.create(

在我的Android应用程序中,我使用一个行为主题“获取数据”,从数据提供商到我的UI和其他需要数据的服务。作为示例,让我们假设这些是针对用户的消息

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

这工作得很好,但我对主题的初始化有问题,或者用另一种方式在应用程序启动时设置主题的初始值

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

我目前在数据提供程序的初始化中执行以下操作:

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

getDataFromNetwork().subscribe(data -> subject.onNext(data));
BehaviorSubject subject=BehaviorSubject.create();
getDataFromNetwork().subscribe(数据->subject.onNext(数据));
其中
getDataFromNetwork()
返回网络调用结果的可观察值

问题: 上述将手动从网络刷新的可观察对象连接到行为主体的结构不知何故感觉错误/不优雅。有没有更好的方法用另一个可观察对象初始化一个行为主体

我在想这样的事情:
BehaviorSubject.create(Observable obs)
或在我的例子中
BehaviorSubject.create(getDataFromNetwork())
将设置主题,将其保留为空,直到Observable发出某个内容,然后将该内容“推送”给其订阅者

感觉不对劲的是你在使用一个主题。在Rx中,一般建议不要使用主题(尽可能多),并且你会惊讶地发现,在不使用主题的情况下,你能取得多大的成就

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

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

如何将更新的数据馈送到
cachedData
Observable中?
getDataFromNetwork()
正在馈送数据,但您的问题可能意味着您希望不时重新执行网络查询?如果是这样的话,在什么条件下你会这样做?开关+发射可观测的可观测的可观测的。。。令人惊叹的!非常感谢。(为了回答您的问题,刷新是通过时间或用户交互触发的,但这只是将这些事件“管道化”到刷新obs中,对吗?)是的,最终会包含一个初始值,以确保任何观察者都会获得一个值,即使从未调用过刷新。
Observable<Data> cachedData = refreshObs.map(t -> getDataFromNetwork())
                                        .switchOnNext()
                                        .publish().replay(1);