gpt4 book ai didi

kotlin - 当我从远程服务器提取数据时,我是否总是将 withContext(Dispatchers.IO) 添加到挂起状态?

转载 作者:行者123 更新时间:2023-12-02 12:07:53 25 4
gpt4 key购买 nike

我正在学习 Kotlin 的协程。

以下内容来自文章https://developer.android.com/kotlin/coroutines .

重要提示:使用 suspend 不会告诉 Kotlin 在后台线程上运行函数。挂起函数在主线程上运行是正常的。在主线程上启动协程也很常见。当您需要主要安全时,您应该始终在挂起函数中使用 withContext(),例如读取或写入磁盘、执行网络操作或运行 CPU 密集型操作时。

通常,当我从远程服务器拉取数据时会花费很长时间,因此我需要在后台线程中放置“拉取数据功能”,以免卡住主 UI。

当我使用挂起从远程服务器提取数据时,我应该总是在挂起中添加 withContext(Dispatchers.IO) 吗?

顺便说一句,

代码 A 来自项目 https://github.com/googlecodelabs/kotlin-coroutines ,可以看到it .

但是我在项目中找不到关键字withContext(),为什么?

代码 A

fun refreshTitle() = launchDataLoad {
repository.refreshTitle()
}


private fun launchDataLoad(block: suspend () -> Unit): Unit {
viewModelScope.launch {
try {
_spinner.value = true
block()
} catch (error: TitleRefreshError) {
_snackBar.value = error.message
} finally {
_spinner.value = false
}
}
}

最佳答案

Should I always add withContext(Dispatchers.IO) in suspend when I use suspend to pull data from remote server?



这取决于。如果您使用像 Retrofit 2.6.0 这样的库具有对 suspend 的 native 支持, 调度员已经是 Dispatchers.IO (或图书馆认为更合适的任何内容)。

如果从远程服务器拉取数据的调用被阻塞,你需要确保在 Dispatcher.IO 上运行它。自己与 withContext(Dispatchers.IO)不阻塞主线程。

I can't find the keyword withContext() in the project, why?



因为项目使用Retrofit,所以切换到 Dispatchers.IO发生在引擎盖下:
https://github.com/googlecodelabs/kotlin-coroutines/blob/master/coroutines-codelab/finished_code/src/main/java/com/example/android/kotlincoroutines/main/MainNetwork.kt

关于kotlin - 当我从远程服务器提取数据时,我是否总是将 withContext(Dispatchers.IO) 添加到挂起状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60911310/

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