【问题标题】:Best way to use kotlin coroutine scope - android [closed]使用 kotlin 协程范围的最佳方法 - android [关闭]
【发布时间】:2020-11-29 18:45:30
【问题描述】:

我是 android 和 kotlin 协程的新手。我一直在使用带有协程的 okhttp API lib。下面是代码:

应用扩展类:

class App: Application() {
    companion object {
        val SCOPE = CoroutineScope(Dispatchers.Main)
    }
}

在 MainActivity 类中:

App.SCOPE.launch {
    val results = Api.get(url)
    UpdateUI(results)
}

API 类:

suspend fun get(url: String): String = withContext(Dispatchers.IO) {
    try {
        val data = httpClient.newCall(request).execute()
        return@withContext data.body!!.string()
    } catch (e: Exception) {
        throw java.lang.Exception(e.message)
    }
}

这很好,但这是最好的方法吗?

【问题讨论】:

  • 通常不鼓励使用全局作用域,您应该使用您的活动lifecycleScope,以便在您的活动被销毁时优雅地取消您的调用。

标签: android kotlin kotlin-coroutines coroutine


【解决方案1】:

请阅读medium article,了解不应取消的操作。 否则,即使活动和片段生命周期被破坏,对于需要执行的非常重要的操作似乎也是正确的。 但是在您的情况下,您只是在更新 UI,那么当您进行网络调用的活动被破坏时,继续网络调用或等待其响应是否有意义?因此,您可能应该使用生命周期协程范围,因为它们的范围仅限于组件的生命周期。请看这个android documentation 此外,您可以使用改造来减少样板,因为改造也支持协程,并且您可以在改造 ApiInterface 中使用挂起修饰符,并且内部改造会自动将调度程序更改为 IO(当使用挂起修饰符时),因此您无需手动执行. 所以你的最终代码应该是这样的:

在 MainActivity 类中:

lifecycleScope.launch {
    val results = Api.get(url)
    UpdateUI(results)
}

API 类:

suspend fun get(url: String): String = retrofitClient.get(url)

【讨论】:

    猜你喜欢
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多