我是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
之前调用。
答案 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()
}