1

我是 Kotlin 和协程的新手。但是我想用它来初始化 Android ThreeTen backport library,这是一个长期运行的任务。我正在使用 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 时没有初始化库的问题。根据我的理解initUI,不应该在被调用之前AndroidThreeTen.init调用。

4

1 回答 1

4

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

长答案是您的代码需要在初始化 UI之前初始化 AndroidThreeTen,因此您必须等待完成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()
}
于 2017-05-11T08:10:36.890 回答