我有一个kotlin流量计时器。这是我的代码:
class CountDownTimer {
suspend fun startTimer(value: Int, onTick: OnTickCallback, onFinish: OnFinishCallback) {
onTick.invoke(0)
(1..timerValue)
.asSequence()
.asFlow()
.onEach {
delay(DELAY)
onTick.invoke(it)
}
.onCompletion {
onFinish.invoke()
}
.cancellable()
.collect()
}
}
一切运行良好,但有时我会启动一个新计时器,但目前的计时器还没有完成。所以我想取消计时器,如果我启动一个新的。我知道,为此,我需要得到一个Job
,并在上面调用一个cancel()
。但我不能创造工作,因为我没有CoroutineScope
。是的,我可以在类CountDownTimer的构造函数中插入作用域,但是我需要将计时器附加到viewModelScope。
因此,我在viewModelScope中的视图模型中启动计时器。
viewModelScope.launch {
countDownTimer.startTimer(
60,
onTick= { // some logic },
onFinish= { // some logic }
)
}
现在,我可以在开始计时器取消()作业之前获得模型。
但是事实证明,我必须将作业对象存储在视图模型中,这样做正确吗?也许还有更自动化的方法来取消一份工作。或者我最好把其他的CoroutineScope
注入到我的CountDownTimer
中,那么问题是CoroutineScope
应该是什么?
求你帮帮我。
发布于 2022-07-14 12:38:03
viewModelScope.launch {}
是一份工作。您可以将它保存到变量中,并随时取消它。将其存储在viewmodel
中是可以的。
val job = viewModelScope.launch { ... }
job.cancel()
https://stackoverflow.com/questions/72978051
复制相似问题