程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Kotlin Flow:当我有新订阅者时,如何从订阅中获取缓存数据?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Kotlin Flow:当我有新订阅者时,如何从订阅中获取缓存数据??

开发过程中遇到Kotlin Flow:当我有新订阅者时,如何从订阅中获取缓存数据?的问题如何解决?下面主要结合日常开发的经验,给出你关于Kotlin Flow:当我有新订阅者时,如何从订阅中获取缓存数据?的解决方法建议,希望对你解决Kotlin Flow:当我有新订阅者时,如何从订阅中获取缓存数据?有所启发或帮助;

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

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

例:

片段 A -> 对话片段 B

  • FragmentA : onResume
  • FragmentB : 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

,

我认为当您的视图进入 PAUSED 状态时,您的 LiveData 可能会变为非活动状态。

我会仔细检查是否是这种情况,LiveData.onInactive() 此外,我不会将其转换为 LiveData 我只会观察流程:

repository.observeData().flowWithLifecycle(this,Lifecycle.State.STARTED)
    .onEach {
        ...
    }
    .launchIn(lifecycleScopE) // or viewLifecycleScope

大佬总结

以上是大佬教程为你收集整理的Kotlin Flow:当我有新订阅者时,如何从订阅中获取缓存数据?全部内容,希望文章能够帮你解决Kotlin Flow:当我有新订阅者时,如何从订阅中获取缓存数据?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。