初始化 lateinit var 时收到通知 (Kotlin)
Notified when lateinit var has been initialised (Kotlin)
这是一个直截了当的问题,但我找不到答案。当 lateinit var
在 Kotlin 中初始化时,有没有办法收到通知?
我知道我可以检查它是否已用 this::coolvar.isInitialized
初始化,但这不一样。
谢谢
lateinit var
仅在未初始化值在应用上下文中没有意义的最简单情况下工作良好,例如 onCreate()
.[=15= 中的依赖注入或延迟初始化]
您需要的是具有特定行为的 属性 委托。看看 Delegates.observable
:
var coolvar by Delegates.observable("initial value") { _, old, new ->
println("coolvar has been updated")
}
如果您使用的是 Kotlin 协程,则可以使用 delay() 函数来处理它。
对于复杂场景。如果值更改调用此函数,则不像直接调用此函数。
示例:
private var lateinit extractFilesThread: Deferred<Unit>
private fun init() {
GlobalScope.async {loadData()}
GlobalScope.async {doSomeWork()}
}
private suspend fun loadData() {
extractFilesThread = GlobalScope.async {
initialFilesManager.extractDataIfNeeded()
}
}
private suspend fun doSomeWork() {
GlobalScope.async {
waitExtractFilesThread()
startThisWork()
}
}
private suspend fun waitExtractFilesThread() {
while (!::extractFilesThread.isInitialized) {
delay(HALF_SECOND_IN_MILI)
}
extractFilesThread.await()
}
所以这里你想在extractFilesThread完成后调用startThisWork()
并且你不能只在它已经初始化的情况下使用 await() ,所以我们使用 delay() 函数,它是一个挂起函数,所以它不会阻止其他函数的执行。
这是一个直截了当的问题,但我找不到答案。当 lateinit var
在 Kotlin 中初始化时,有没有办法收到通知?
我知道我可以检查它是否已用 this::coolvar.isInitialized
初始化,但这不一样。
谢谢
lateinit var
仅在未初始化值在应用上下文中没有意义的最简单情况下工作良好,例如 onCreate()
.[=15= 中的依赖注入或延迟初始化]
您需要的是具有特定行为的 属性 委托。看看 Delegates.observable
:
var coolvar by Delegates.observable("initial value") { _, old, new ->
println("coolvar has been updated")
}
如果您使用的是 Kotlin 协程,则可以使用 delay() 函数来处理它。 对于复杂场景。如果值更改调用此函数,则不像直接调用此函数。
示例:
private var lateinit extractFilesThread: Deferred<Unit>
private fun init() {
GlobalScope.async {loadData()}
GlobalScope.async {doSomeWork()}
}
private suspend fun loadData() {
extractFilesThread = GlobalScope.async {
initialFilesManager.extractDataIfNeeded()
}
}
private suspend fun doSomeWork() {
GlobalScope.async {
waitExtractFilesThread()
startThisWork()
}
}
private suspend fun waitExtractFilesThread() {
while (!::extractFilesThread.isInitialized) {
delay(HALF_SECOND_IN_MILI)
}
extractFilesThread.await()
}
所以这里你想在extractFilesThread完成后调用startThisWork() 并且你不能只在它已经初始化的情况下使用 await() ,所以我们使用 delay() 函数,它是一个挂起函数,所以它不会阻止其他函数的执行。