2014-09-04 80 views
1

在我的应用程序中,客户端使用由Observable支持的服务。每个服务调用都是基于会话的,因此必须在调用业务服务方法之前启动会话。防止观察对象被启动,除非另一个观察对象完成它的工作

为了初始化会话,我做了一个Observable这样做。我的问题是,无论何时客户端并行使用多个业务服务,会话初始化都会被重复。客户端代码与会话无关。我需要一种初始化会话的方式,以便只能调用一次会话(当第一个业务服务方法被调用时)。基本上所有后续的业务观察员都必须等待条件(会话初始化)。你能为它画一个图案吗?

客户端代码是这样:

protected void onCreate(Bundle savedInstanceState) { 
    itemService.getItems(10).subscribe(new Observer<List<Item>>() {..}); 
    userService.getProfile().subscribe(new Observer<List<Profile>>() {..}); 
} 

虽然是2个电话,需要进行会话Observable一次只执行,使企业Observable拭目以待用于会话初始化完成,然后开始做它的工作。

谢谢。

+0

我不完全理解的问题,但也许你可以看看这里的发布连接模式:https://github.com/ReactiveX/RxJava/wiki/Connectable-Observable-Operators – nikoniko 2014-09-08 05:00:22

回答

0

既然你已经有一个会议Observable的实施,一个可能的解决方案是将其转换为AsyncSubject。它只会执行一次,并且仅向每个订户发出最后一个项目(或仅项目)。

根据您的会话初始化代码是如何工作的,它可能是更优雅的使用Async运营商,如Async.start()Async.startFuture()之一创建会话观测。

+0

对不起,我不能围绕你的建议包裹我的头。你能举个例子吗?我编辑了这个问题来澄清一点。谢谢。 – midnight 2014-09-05 10:45:51

2

如果会话初始化是可观察到的,那么你可以延迟依赖于它的其他所有观测量,采用delay运营商与会话初始化观察为参数:http://reactivex.io/RxJava/javadoc/rx/Observable.html#delay%28rx.functions.Func1%29

+0

这几乎是我需要的,只是推迟观察者必须是第一个被执行的人。延迟似乎执行延迟可观察和应用延迟后可观察。 – midnight 2014-09-09 08:17:49

+0

您也可以使用flatMap,它可以被理解为在源Observable的每次发射之后运行新的Observable。但我倾向于说,你可能从错误的角度思考问题。观察者不应该是“工作”,他们应该只是事件流或数据流。如果Observable A和B依赖于X的值,则需要开始查看诸如'flatMap'或'map'的运算符。 – 2014-09-09 08:34:47