gpt4 book ai didi

android - RxJava 运算符类似于 replay(1, 1, MINUTE) 但在 1 分钟后重新订阅

转载 作者:搜寻专家 更新时间:2023-11-01 09:19:11 24 4
gpt4 key购买 nike

我需要一种相对简单的过期缓存机制(比如 1 分钟)。

  1. 当第一个订阅者订阅时,我想调用 API。
  2. 当第二个订阅者在一分钟内订阅时,不想进行 API 调用,而是将之前加载的值推送到下游。
  3. 当另一个人在第一个订阅后一分钟后订阅时,我希望再次进行 API 调用。

现在,我想在单个 rxjava 链中执行此操作。 .replay(1, 1, MINUTE) 看起来很完美,直到我了解到,一分钟过去后,源 observable 不会被重新订阅。我再也没有从那个可观察到的东西中得到任何东西。我可能需要将 replay()repeatWhen{} 合并的东西,但找不到它。我尝试了非常奇特的组合,但没有一个对我的测试用例有效。

最佳答案

这可能不是最好的解决方案,但我会尝试这样做:

    public final class SimpleCacheSingle<T : Any> constructor(
val apiRequest: (value: String, callback: (T) -> Unit) -> Unit
) {
private var lastTimeSeconds = 0L
private lateinit var cachedValue: T

fun getSingle(): Single<T> = Single.create { emitter ->
if (System.currentTimeMillis() / 1000 - lastTimeSeconds > 60) {
apiRequest("example argument") {
cachedValue = it
lastTimeSeconds = System.currentTimeMillis() / 1000
emitter.onSuccess(cachedValue)
}
} else {
emitter.onSuccess(cachedValue)
}
}
}

只需创建它的一个实例,然后使用 getSingle() 为每个订阅者创建一个。

当然,附件代码 fragment 中的“apiRequest”需要修改以满足您的需求。

编辑:请注意,当您在上一个 API 调用完成之前订阅时,您将有两个或更多待处理的 API 请求,而不是一个。您将必须修改代码,以便一次只有一个请求。

关于android - RxJava 运算符类似于 replay(1, 1, MINUTE) 但在 1 分钟后重新订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58122789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com