2016-12-06 113 views
1

我有这个问题,我一直在寻找,但找不到解决方案(或者我不能根据其他答案做出解决方案)。RxJava等待一个观察者与订阅者等待另一个观察者与其他订阅者

我的问题是,我需要找到一种方式来等待一个观察者(用它自己的用户)并等待另一个观察者(用它自己的用户)来完成。

这是情景:

OBS1 - > retryWith(tokenAuthenticator) - > SUBSCRIBER1 - >更新UI

OBS2 - >需要等待OBS1获得新令牌 - > subscriber2用户 - > 更新UI

我主要关心的是我需要两个订户。我的观点obs1和obs2并行运行,但需要检查obs1是否用新会话标记结束。也许这不是RxJava的主要目的。

Obs1连接到HTTP连接并获取带有数据的Json以填充用户界面,obs2也是如此,但用其他json和其他信息填充UI。

对我来说唯一的问题是我的会话令牌每5分钟过期,当我尝试获取新的obs2时,已经使用过期的会话令牌进行呼叫。

简单的解决方案是在onComplete()subscriber1中执行obs2,但我知道它必须是一个更好的解决方案,使用RxJava。

+0

Rxjava为您提供了各种可以帮助您的操作符,您可以尝试使用这些操作符来处理例如。重试,重试,去抖等 –

+0

如果问题只在令牌刷新,比你可以从okhttp客户端尝试本机'Authenticator'我描述了它在其他问题:http://stackoverflow.com/questions/40762911/call-another-retrofit -call-on-subject-emission/40771313#40771313 –

回答

2

看看zip这将允许你结合两个可观察的结果(如果你想要并行运行)。这里有一个例子:

obs1.subscribeOn(Schedulers.io()) 
    .zipWith(obs2.subscribeOn(Schedulers.io()), (x,y) -> new Both(x,y)) 
    .doOnNext(both -> updateUI(both)) 
    .subscribe(); 
+0

Dave,谢谢你的大力帮助。我已经看到了zip运算符,它是一样的zip和zipWith?创建一对两个结果来做到这一点并使用相同的订户是否是一个很好的解决方案?我在Rx非常新。 –

+0

对两位订户使用一个订户是一个不错的主意,因为您可以更好地控制初始者的错误行为(例如,一次故障会停止两个可观察事件)。 –

+0

Dave,这实际上很有用,但我有一个关于Schedulers.io()的问题。对于每个可观察的,如果你在Schedulers.IO上订阅,意味着它将运行在不同的线程中?或者它是多余的?谢谢 –