我正在调用 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
});