android - Kotlin Coroutines 等到完成 init block

标签 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 它可以工作,但我真的不想使用它...

提前致谢!

最佳答案

How I can force to wait until my object retrofit has initialized?

Coroutines 在这里帮不了你。如果在迁移到协程之前,您可以在 Retrofit 初始化时阻塞主 UI 线程,那么就这样吧,不要涉及协程。

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

协程给你的唯一优势是干净的编程模型:

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

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

关于android - Kotlin Coroutines 等到完成 init block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52928753/

相关文章:

android - constructor() 是 Kotlin 中的主要构造函数吗?

构建时发生 Android 数据绑定(bind)错误

java - Android - 线程未执行

Android 层次结构

http - Kotlin Http 客户端。将 map 中的参数添加到请求

java - 通过低功耗蓝牙(即通过信标)向附近的移动设备发送通知,且设备上未安装任何应用程序

kotlin - 关闭后忽略协程 channel 的报价

kotlin - 如何使用 Kotlin 协程从 Deferred future 创建 Observable

kotlin - 只有 Kotlin 协程的数据流?

android - 在运行时初始化依赖