gpt4 book ai didi

android - 使用 kotlin 协程范围的最佳方式 - android

转载 作者:行者123 更新时间:2023-12-04 08:30:13 26 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

9 个月前关闭。




Improve this question




我是 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)
}
}
这工作正常,但这是最好的方法吗?

最佳答案

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

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

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

关于android - 使用 kotlin 协程范围的最佳方式 - android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65063799/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com