【发布时间】:2021-06-20 16:23:03
【问题描述】:
变量声明
private lateinit var wayoJob: Job
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + wayoJob
功能
@InternalCoroutinesApi
private fun startRepeatingJob(timeInterval: Long): Job {
return CoroutineScope(Dispatchers.Default).launch {
while (NonCancellable.isActive) {
Log.i("API", "UPDATE")
delay(timeInterval)
}
}
}
在开始按钮中
wayoJob = startRepeatingJob(5000L)
在 Button end 和 onDestroy()
wayoJob.cancel()
当我点击结束按钮时,它返回一个错误:
原因:kotlin.UninitializedPropertyAccessException:lateinit 属性 wayoJob 尚未初始化
有没有办法解决这个问题?
我必须做一个功能,当我按下一个按钮时每隔几秒钟开始执行一次,当我点击另一个按钮时会结束。
编辑:
我可以用我自己的 shouldBeActive 值尝试这样的事情,并在需要时运行,但这不是应该的
var shouldBeActive = false
@InternalCoroutinesApi
private fun startRepeatingJob(timeInterval: Long): Job {
return CoroutineScope(Dispatchers.Default).launch {
while (NonCancellable.isActive && shouldBeActive) {
Log.i("API", "UPDATE")
delay(timeInterval)
}
}
}
【问题讨论】:
-
您确定开始按钮中的那一行正在运行吗?如果正在初始化变量,则不应发生该错误,这会发生。
-
@RyanM 是的,已初始化。我添加了一个日志,它每 5 秒显示一次。当我点击停止时,它会抛出一个没有初始化的错误
-
@RyanM 我找到了解决方案。检查答案
-
为什么你要为你的班级展示实现
CoroutineScope的代码,但你却从不使用它,而是使用一个临时的CoroutineScope(Default)?此外,顶级工作不应该是不断变化的lateinit var。您似乎在使用结构化并发的语法元素,但破坏了结构化并发本身。 -
您的错误消息证实了我上面所说的内容,您的解决方案只是针对实际问题添加了更多技巧。
标签: android kotlin kotlin-coroutines coroutine