gpt4 book ai didi

android - Koltin : Should one use coroutine with delay or CountDownTimer 上 Android 中的定时器实现

转载 作者:行者123 更新时间:2023-12-05 02:35:17 28 4
gpt4 key购买 nike

根据 the commentary of this answer , 使用 CountDownTimer

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() }

ViewModel 内部或其他方式会导致内存泄漏。另一方面,使用 viewModelScope.launch 实现计时器

viewModelScope.launch {
while (true){
_mutableLiveData.postValue(newValue)
delay(10)
}
}

在同一个 ViewModel 中会浪费资源,因为线程应该在执行完任务后退出而不是进入休眠状态。

我应该使用哪种方式?

是否有一些其他我错过的惯用方式?

我的问题的上下文是这样的:在 ViewModel 中,我的计时器实现(当前使用 delay)定期更改私有(private) MutableLiveData observedAsState@Composable

最佳答案

CountDownTimer 仅当您在其关联对象超出范围时不清理它时才会泄漏内存。因此,在 ViewModel 中,您应该在属性中存储对它的引用,并在 onCleared() 中对其调用 cancel()。在 Activity 中,您可以在 onDestroy() 中取消它。等等。

viewModelScope 被设置为在 ViewModel 被销毁时自动取消它正在运行的任何协程,因此您不必担心泄漏。

同样,Activity 或 Fragment 中的 lifecycleScope 执行相同的操作,而 viewLifecycle.lifecycleScope 为 Fragment 的 View 生命周期执行此操作。

在线程中调用 sleep 会阻止该线程执行任何工作,因此它会占用处理器的核心。而且绝不能在主线程上完成,因为那样会锁定 UI。

在协程中,delay 不会锁定任何线程或协程,因此同样的问题不适用。

关于android - Koltin : Should one use coroutine with delay or CountDownTimer 上 Android 中的定时器实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70613726/

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