【问题标题】:Retrofit+rxjava unique request in stackRetrofit+rxjava 堆栈中的唯一请求
【发布时间】:2015-08-26 19:09:44
【问题描述】:

问题:如何让retrofit+rxjava请求唯一?例如用户可以点击很多按钮,并且会有很多请求。 所以,我的观点是,如何只发送一个请求,而其他相同的请求会自动丢弃。 (一次应该只运行一个相同的请求)

使用布尔值的解决方案(在执行任务之前检查该任务是否已经在运行),但也许有人可以提出更好、更通用的解决方案?

非常感谢。

【问题讨论】:

  • 检查操作员 amb。它应该符合您的需求。另一种方法是在短时间内限制请求。
  • 如果我错了,请纠正我,但是我在执行 observable 后无法动态添加对象到 amb?或者我可以?那该怎么做呢?
  • 构建一个发出 observable 的 observable。我想我读你的问题太快了,错过了一点:每个 ID 的唯一请求。如果我理解正确,您可以使用 groupBy 运算符(以及每个 id/请求的组)而不是 take(1) 和 flatMap 分组的 observable。在这种情况下,它应该只请求一次。

标签: android queue retrofit rx-java


【解决方案1】:

听起来您可以使用distinct()distinct(Func1)。例如,给定一个输入框和一个按钮,如果用户单击该按钮,您希望获取输入框的值并进行一些网络调用:

TextBox text = ...
Button button = ...

button.clickObservable()
.map(e -> text.getText())
.distinct()
.flatMap(txt -> networkApi.someCall(txt))
.observeOn(uiScheduler)
.subscribe(...)

【讨论】:

    【解决方案2】:

    这是我在当前项目中使用的解决方案。

    每个请求 - 具有自定义逻辑的类。每个请求都有唯一的请求 ID。每个请求都可以访问包含 id 和订阅类的 HashMap。在开始新请求之前,我检查了 map 是否已经包含一个 id 键,如果是这样,那么有两个变体(取决于特定的请求)我可以取消订阅以前的请求并启动新请求,或者只是忽略新请求的开始。

    【讨论】:

      猜你喜欢
      • 2016-08-15
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 2016-01-29
      • 2021-09-04
      • 2017-12-03
      相关资源
      最近更新 更多