6

这是一个直截了当的问题,但我找不到答案。lateinit var在 Kotlin 中初始化a 时有没有办法得到通知?

我知道我可以检查它是否已被初始化,this::coolvar.isInitialized但这不一样。

谢谢

4

2 回答 2

3

lateinit var只有在未初始化的值在应用程序上下文中没有意义的最简单情况下才能正常工作,例如依赖注入或onCreate().

您需要的是具有特定行为的属性委托。看看Delegates.observable

var coolvar by Delegates.observable("initial value") { _, old, new ->
    println("coolvar has been updated")
}
于 2017-12-07T08:16:13.427 回答
0

如果您使用的是 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 Finished 之后调用 startThisWork() 并且只有在它已经初始化的情况下才能使用 await() ,所以我们使用 delay() 函数,它是一个挂起函数,所以它不会阻塞其他函数的执行。

于 2019-12-10T01:25:03.197 回答