android - Fragment中状态流的Android通用函数
问题描述
我在我的应用程序中使用StateFlow
,在我的应用程序中我Fragment
使用它来 -
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
. 我怎么能使用一个通用函数,这样我就可以避免job?.cancel
在每个片段中都这样做。
我不喜欢使用BaseFragment
解决方案
一个简单的解决方案是利用片段生命周期在暂停时自动取消作业。
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{
...
}
}
}
}
如果每个片段有很多这样的工作,我建议改用自定义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{
...
}
}
}
}
推荐阅读
- android - 命令'react-native log-android'卡在'Starting Logkitty'
- c# - Linq 计数返回 0 但 foeach 返回其他值
- openid-connect - OIDC 云代理与 SIOP 边缘代理
- java - JavaFX:设置每列的最小宽度
- r - 在 R 中保存工作区图像
- r - 如何将数据(csv)从fileInput()闪亮上传到S3?
- scala - 无法将 String[][] 中的元素包含在 Scala 的单个数据结构中
- python - Python 正则表达式仅匹配字母数字字符后的单个“/”
- enterprise-architect - Enterprise Architect - 如何将列键设置为 Autonum?
- excel - 如何删除单元格开头和结尾的空格?