gpt4 book ai didi

用于 fragment 中状态流的 Android 通用函数

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

我在我的应用程序和我的 Fragment 中使用 StateFlow 我用它来 -

private var job: Job? = null

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

job = lifecycleScope.launchWhenResumed {
viewModel.getData().collect {
// ...
}
}
}

override fun onPause() {
job?.cancel()
super.onPause()
}

如您所见,我在 onPause 中取消了作业。我如何使用通用函数以避免在每个 fragment 中执行 job?.cancel

我不想使用 BaseFragment

最佳答案

一个简单的解决方案是利用 fragment 生命周期在暂停时自动取消作业。

fun CoroutineScope.launchUntilPaused(lifecycleOwner: LifecycleOwner, block: suspend CoroutineScope.() -> Unit){
val job = launch(block = block)
lifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver {
override fun onPause(owner: LifecycleOwner) {
job.cancel()
lifecycleOwner.lifecycle.removeObserver(this)
}
})
}

//Usage
class MyFragment: Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
lifecycleScope.launchUntilPaused(this){
someFlow.collect{
...
}
}
}
}

如果每个 fragment 有许多这样的作业,我建议改用自定义 CoroutineScope,以避免激活许多生命周期观察器。

class CancelOnPauseScope(lifecycleOwner: LifecycleOwner): CoroutineScope by MainScope(){
init{
lifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver{
override fun onPause(owner: LifecycleOwner) {
cancel()
lifecycleOwner.lifecycle.removeObserver(this)
}
})
}
}

class MyFragment: Fragment() {
private val scope = CancelOnPauseScope(this)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
scope.launch{
someFlow.collect{
...
}
}
}
}

关于用于 fragment 中状态流的 Android 通用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65112853/

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