RxJava 2&改造2个连续的独立呼叫

时间:2017-06-26 14:25:45

标签: java android retrofit2 rx-java2

我正在调用API。当应用程序启动时,我需要从API获取一个令牌才能执行其他调用。令牌由应用程序内的“令牌管理器”管理。我正在使用RxJava 2和Retrofit 2来管理呼叫。

当我启动应用程序时,令牌管理器获取令牌,Fragment获取数据。我希望调用顺序执行,因为它们都使用与Dagger 2注入相同的Retrofit客户端对象。 但是,实际上,在获取令牌的调用完成之前执行了获取数据的调用,并且由于此调用需要令牌,因此请求失败。

有些人建议使用平面地图,但我无法在应用程序中的两个不同位置(TokenManager类和Fragment)管理逻辑。 我该如何解决我的问题?

1 个答案:

答案 0 :(得分:1)

因此,根据您的描述,您提到您无法使用flatmap(),但根据您的要求,似乎两个调用中的一个依赖于另一个。

无论如何可能性如下:

依赖呼叫 - 同一地点(例如活动)
在这种情况下,您应该使用flatMap()例如调用A和B,调用A必须获取令牌以便B可以执行。
依赖呼叫 - 不同地方(例如服务 - 活动)
这种情况最合适的方式是事件总线,您可以使用Rxjava中的PublishSubject来实现这样的事件总线。

所以在你的情况下,第二个解决方案是要走的路。 你在令牌管理器中获得令牌,然后通知任何需要它的屏幕,你也可以通知它到期,所以应用程序不会不必要地点击网络。

作为一个简单的例子:

PublishSubject<Token> publishToken = PublishSubject.create();

//notify others that you got a Token
publishToken.onNext(myToken);
..
..
//in other place (eg fragment)
getTokenEventBus().subscribe(token -> {
  //do your other call
 }, throwable ->{ 
  //handle error
 }, () -> {
  //event complete
});