初始化 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() 函数,它是一个挂起函数,所以它不会阻止其他函数的执行。