RxJava 2 & Retrofit 2 顺序独立调用

RxJava 2 & Retrofit 2 sequential independent calls

我正在打电话 API。当应用程序启动时,我需要从 API 获取令牌才能进行其他调用。令牌由应用程序内部的 "token manager" 管理。我正在使用 RxJava 2 和 Retrofit 2 来管理调用。

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

有些人建议使用平面图,但我不能,因为逻辑在应用程序的两个不同位置进行管理(TokenManager class 和 Fragment)。 我该如何解决我的问题?

所以根据您的描述,您提到您不能使用 flatmap(),但根据您的要求,这两个调用中的一个似乎依赖于另一个。

总之有以下几种可能:

相关呼叫 - 同一个地方(例如 Activity)
在这种情况下,您应该使用 flatMap() 例如调用 A 和 B,调用 A 必须获得令牌才能执行 B。
依赖调用 - 不同的地方(例如服务 - Activity)
最适合这种情况的方法是事件总线,你可以使用 Rxjava 中的 PublishSubject 来实现这样的事件总线。

所以在你的情况下,第二种解决方案是可行的。 您在 TokenManger 中获取令牌,然后通知任何需要它的屏幕,您也可以通知其过期,这样应用就不会不必要地访问网络。

举个简单的例子:

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
});