【问题标题】:Kotlin Coroutines wait until done init blockKotlin Coroutines 等待完成初始化块
【发布时间】:2018-10-22 11:55:10
【问题描述】:

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

如何强制等到 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 它可以工作,但我真的不想使用它...

提前致谢!

【问题讨论】:

    标签: android kotlin kotlinx.coroutines


    【解决方案1】:

    如何强制等到我的对象 retrofit 已初始化?

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

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

    协程给您的唯一优势是简洁的编程模型:

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

    一旦httpClientgson 初始化,您的协程将在 UI 线程上恢复。然后它可以采取行动让您的应用程序初始化继续进行。与此同时,活动的onCreate 已完成,因此您必须将那里依赖于改造的任何东西移到launch 块中。

    【讨论】:

    • “您的 [...] 同时,活动的 onCreate 已完成,因此您必须将依赖于 Retrofit 的任何东西移到启动块中。”听起来像比赛条件:(......我不是一个android类......无论如何谢谢你的提示:)
    • 确实,这意味着您不能再依赖生命周期回调中的排序。您的 retrofit 依赖项变为可空,您必须每次都检查它。那,或者你安排开始你的主要活动作为对retrofit可用的反应。
    • 杰普。这就是我问的原因:) 也许有人知道一个优雅的解决方案。 :)
    猜你喜欢
    • 2020-09-02
    • 2021-10-15
    • 2019-07-18
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2016-06-04
    相关资源
    最近更新 更多