【问题标题】:Use RxJava in queue-like manner and pause/start queue以类似队列的方式使用 RxJava 并暂停/启动队列
【发布时间】:2020-06-21 14:17:26
【问题描述】:

我正在尝试在我的 Android 应用程序中使用 RxJava 以及 Retrofit 来与 RESTful API 进行交互。

在我的 Android 应用程序中,我在各种 UX 事件中发送了许多请求。如果其中一个请求返回“无效令牌”错误,我想暂停任何其他在开始之前排队的请求,以便我可以更新用户的令牌,然后恢复暂停的请求。

这可能使用 RxJava 吗?我只是在学习这个库,找不到这个功能。

谢谢,

【问题讨论】:

  • 我对如何做到这一点有一个模糊的想法,但我无法给出正确的答案。如果每个排队的请求做的第一件事是从 observable 获取用户令牌,然后设置该 observable 以便使令牌无效并使其获得新令牌,该怎么办?

标签: android retrofit rx-java retrofit2 rx-java2


【解决方案1】:

如果这些请求是并行发送的,那么您可能会收到多个“Invalid Token”错误。您可能只想为错误的第一个实例刷新令牌。要在刷新令牌时暂停请求,请将有效令牌的来源视为可观察对象。

假设您有一个包含方法的网络处理类:

Single<Response> makeNetworkRequest(Request request) { ... }
Single<Boolean> getToken() { ... }

它是这样实现的,当令牌可用时发出一个值,否则等待令牌刷新。

然后,您的观察者链将如下所示:

observerChain
  .flatMapSingle(request -> networkHandler.makeNetworkRequest(request)
       .retryWhen(error -> error.flatMapSingle(e -> networkHandler.getToken()))
  ...

retryWhen() 运算符通过提供一个 observable 来从错误中恢复,当该 observable 非空时,它将重新订阅上游 observable,在本例中为 makeNetworkRequest()

由于您没有显示任何您尝试调整的代码,因此您必须对上面的代码进行调整以使其与您的应用程序一起使用。

【讨论】:

    猜你喜欢
    • 2019-01-30
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多