大佬教程收集整理的这篇文章主要介绍了Kotlin Flow:当我有新订阅者时,如何从订阅中获取缓存数据?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的用例中,我有一个带有数据订阅的片段,它每 3 秒自动获取一次数据。并且当fragment被销毁时,这个订阅就会停止,因为没有订阅者使用这个数据订阅。
但是,如果我从这个片段打开一个弹出对话框片段,并且该对话框片段与数据订阅相关联。我会得到一个奇怪的用户体验,用户可能需要等待 3 秒才能看到数据。我发现第一个片段没有暂停,它会将第一个调用标志视为无效并延迟 3 秒以发出新数据。
案例:
片段 A -> 对话片段 B
这是我的存储库类,其中包含使用简单标志和 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
,我认为当您的视图进入 PAUSED 状态时,您的 LiveData
可能会变为非活动状态。
我会仔细检查是否是这种情况,LiveData.onInactive()
此外,我不会将其转换为 LiveData
我只会观察流程:
repository.observeData().flowWithLifecycle(this,Lifecycle.State.STARTED)
.onEach {
...
}
.launchIn(lifecycleScopE) // or viewLifecycleScope
以上是大佬教程为你收集整理的Kotlin Flow:当我有新订阅者时,如何从订阅中获取缓存数据?全部内容,希望文章能够帮你解决Kotlin Flow:当我有新订阅者时,如何从订阅中获取缓存数据?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。