lin*_*age 5 android timer kotlin kotlin-coroutines android-jetpack-compose
val timer=object:CountDownTimer(Long.MAX_VALUE,10){
override fun onTick(p0: Long) {
_mutableLiveData.postValue(newValue)
}
override fun onFinish() {
TODO("Not yet implemented")
}
}.also { it.start() }
Run Code Online (Sandbox Code Playgroud)
从 a 内部ViewModel
否则会导致内存泄漏。另一方面使用实现定时器viewModelScope.launch
viewModelScope.launch {
while (true){
_mutableLiveData.postValue(newValue)
delay(10)
}
}
Run Code Online (Sandbox Code Playgroud)
从内部同样ViewModel
浪费资源,因为线程在执行其任务后应该退出而不是进入睡眠状态。
我应该使用哪种方式?
我还错过了其他一些惯用的方式吗?
我的问题的上下文是这样的:在 a 中ViewModel
,我的计时器实现(当前使用)定期更改a中正在使用的delay
私有状态。MutableLiveData
observe
AsState
@Composable
如果 CountDownTimer 关联的对象超出范围时不清理它,则只会泄漏内存。因此,在 ViewModel 中,您应该将对其的引用存储在属性中,并cancel()
在onCleared()
. 在 Activity 中,您可以在 中取消它onDestroy()
。等等。
它viewModelScope
被设置为在 ViewModel 被销毁时自动取消正在运行的任何协程,因此您不必担心泄漏。
同样,lifecycleScope
在 Activity 或 Fragment 中执行相同的操作,并viewLifecycle.lifecycleScope
为 Fragment 的 View 生命周期执行此操作。
调用sleep
线程会阻止该线程执行任何工作,因此它会占用处理器的核心。并且绝对不能在主线程上完成,因为这会锁定 UI。
在协程中,delay
不会锁定任何线程或协程,因此同样的问题不适用。
归档时间: |
|
查看次数: |
3926 次 |
最近记录: |