gpt4 book ai didi

android - Kotlin 流 : How can i get the cache data from subscription in flow when i have new subscriber?

转载 作者:行者123 更新时间:2023-12-05 06:00:57 25 4
gpt4 key购买 nike

在我的用例中,我有一个带有数据订阅的 fragment ,它每 3 秒自动获取一次数据。当 fragment 被销毁时,这个订阅将被停止,因为没有订阅者使用这个数据订阅。

但是,如果我从该 fragment 打开一个弹出对话框 fragment ,并且该对话框 fragment 与数据订阅相关联。我会得到一个奇怪的用户体验,用户可能会等待 3 秒才能看到数据。我发现第一个 fragment 没有暂停,它会将第一个调用标志视为无效并延迟 3 秒以发出新数据。

案例:

fragment A -> 对话 fragment B

  • fragment A:onResume
  • fragment B : onResume

这是我的存储库类,其中包含使用简单标志和 while 循环的临时解决方案。我正在使用流,我如何将最后的结果发送给新的观察者,这样他们就不必等待最多 3 秒来接收新数据?

感谢任何建议或评论

DataRepository.kt

class DataRepository {
private val isCalledFirstTime = AtomicBoolean(true)
private val latestData by lazy {
flow {
while (true) {
if (hasSubscription()) {
try {
val response = restService.getData()
emit(response)
isCalledFirstTime.set(false)
} catch (e: Exception) {
logger.e(e)
}
}
if (isCalledFirstTime.get()) {
delay(200)
} else {
var count = 0
do {
delay(200)
} while (count++ < (200 / 3000) && !isCalledFirstTime.get())
}
}
}
}
fun observeData() = latestData
}

最佳答案

因为您的 latestData 是冷流,您必须将其转换为热流(如 StateFlow 或 SharedFlow),以获取具有相同发布者的缓存值。

为此,我们将使用 Flow.shareIn 运算符

class DataRepository() {
private val repoScope = CoroutineScope(Dispatchers.IO + SupervisorJob())
private val latestData by lazy {
flow {
// Your code
}.shareIn(
repoScope,
replay = 1,
started = SharingStarted.WhileSubscribed()
)
}
}
  • replay:开始订阅时,您希望从缓存中获取多少个值。

更多信息在这里:Making cold flows hot using shareIn

关于android - Kotlin 流 : How can i get the cache data from subscription in flow when i have new subscriber?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67413165/

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