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

当我启动应用程序时, token 管理器获取 token , fragment 获取数据。我希望这些调用能够按顺序执行,因为两者都使用注入(inject) Dagger 2 的同一个 Retrofit 客户端对象。 但实际上,获取数据的调用是在获取 token 的调用完成之前执行的,并且由于该调用需要 token ,因此请求失败。

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

请您参考如下方法:

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

无论如何,可能性如下:

相关调用 - 同一位置(例如 Activity)
在这种情况下,您应该使用 flatMap() 例如调用 A 和 B,调用 A 必须获取 token ,以便执行 B。
相关调用 - 不同位置(例如服务 - Activity )
最适合这种情况的方法是事件总线,您可以使用 Rxjava 中的 PublishSubject 来实现这样的事件总线。

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

举个简单的例子:

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


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!