Kotlin协程等待直到完成init块

时间:2018-10-22 11:55:10

标签: android kotlin kotlinx.coroutines

我目前正在学习协程,需要您的帮助:)

如何强制等到 retrofit 初始化?

private lateinit var retrofit: Retrofit

init {
    val time = measureTimeMillis {
        launch {
            val httpClient = createOkHttpClient(...)
            val gson = createGson()
            retrofit = createRetrofit(httpClient.await(), gson.await())}
    }
    logger.debug("Init time: $time")
}

 private fun <T> createService(class: Class<T>) = retrofit.create(_class)

使用runBlocking可以运行,但是我真的不想使用它...

提前谢谢!

1 个答案:

答案 0 :(得分:0)

  

如何强制等待对象 retrofit 初始化?

协程在这里无法为您提供帮助。如果在迁移到协程之前,您可以在Retrofit初始化时阻止主UI线程,那么就这样保留它,并且不涉及协程。

如果您有一个异步任务在后台执行,那么无论过去延迟初始化的后果是什么,协程也将保留它们。

协程为您提供的唯一优势是简洁的编程模型:

    launch {
        val httpClient = createOkHttpClient(...)
        val gson = createGson()
        retrofit = createRetrofit(httpClient.await(), gson.await())
        ... take the actions that depend on retrofit ...
    }

httpClientgson初始化后,协程将在UI线程上恢复。然后,它可以采取使您的应用程序初始化继续进行的操作。在此期间,活动的onCreate已完成,因此您必须将那里依赖于Retrofit的所有内容移到launch块中。