异步不等待等待

时间:2017-05-10 17:07:31

标签: android kotlin async-await kotlin-coroutines

我是Kotlin和协同程序的新手。但是我想用它来初始化Android ThreeTen backport库,这是一个长期运行的任务。我正在使用Metalab Async / Await Library(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之前调用。

1 个答案:

答案 0 :(得分:4)

简短的回答是你不应该使用Kotlin协程。

答案很长,你的代码需要在初始化你的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()
}