异步不等待等待

Async not waiting for await

我是 Kotlin 和协程的新手。但是我想用它来初始化 Android ThreeTen backport 库,这是一项很长的 运行 任务。我正在使用 Metalab Async/Await 库 (co.metalab.asyncawait:asyncawait:1.0.0)。

这是我的代码:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val application = this

    async {

        //non-blocking initialize ThreeTen
        await { AndroidThreeTen.init(application) }

        //initialize UI on UI thread which uses the ThreeTen library
        initUI()

    }
}

现在我遇到了初始化 UI 时库没有初始化的问题。根据我的理解,在调用 AndroidThreeTen.init 之前不应调用 initUI

简短的回答是您不应该为此使用 Kotlin 协程。

长答案是您的代码需要初始化 AndroidThreeTen 您初始化您的UI之前,所以您必须等待AndroidThreeTen.init 在尝试调用 initUI 之前完成。由于固有的等待需求,没有理由让您的代码过于复杂。协程不是魔法。他们不会以某种方式更快地等待需要花费大量时间的事情。 AndroidThreeTen.init 使用协程或不使用协程将花费相同的时间。

你应该这样写你的代码:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val application = this

    AndroidThreeTen.init(application)
    initUI()
}