当前位置: 首页 > 知识库问答 >
问题:

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

陶淳
2023-03-14

我正在学习科特林的合作项目。

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

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

通常,从远程服务器提取数据需要很长时间,所以我需要在后台线程中放置“提取数据功能”,以避免冻结主UI。

当我使用suspend从远程服务器提取数据时,是否应该始终在suspend中添加withContext(Dispatchers.IO)?

顺便提一下

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

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

代码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
        }
    }
}

共有1个答案

盛柏
2023-03-14

当我使用suspend从远程服务器提取数据时,是否应该始终在suspend中添加withContext(Dispatchers.IO)?

视情况而定。如果您使用的库(如改装版2.6.0)本机支持挂起,则dispatcher已经是Dispatchers。IO(或库认为更合适的任何内容)。

如果从远程服务器提取数据的调用被阻塞,则需要确保在Dispatcher上运行它。IO使用withContext(Dispatchers.IO)来阻止主线程。

我在项目中找不到带有Context()的关键字,为什么?

由于项目使用改装,因此切换到Dispatchers。IO发生在发动机罩下:https://github.com/googlecodelabs/kotlin-coroutines/blob/master/coroutines-codelab/finished_code/src/main/java/com/example/android/kotlincoroutines/main/MainNetwork.kt

 类似资料:
  • 数据文件包含记录,其中每个值由每个记录的制表符分隔。 服务器A和B都使用Db2 V9.5

  • 我创建了一个数据帧 现在我想从数据框中选择列 这个很好用。但是我可以在同一个语句中包含两列吗。以COL1为年龄,COL2为第一名称,COL3为姓氏。我正在寻找下面提到的输出,包括名字和姓氏。我知道可以使用sparksql来完成。我想知道这可以在上面的df1中完成。select()语句。谢谢

  • 我正在实现客户机/服务器文件发送和接收。 正在发送的部分C代码: 部分Java代码接收: 使用readUTF()函数后,服务器挂起或处于无限循环中,不再继续。我已经使用readLine()尝试了BufferedReader。有一个错误是“没有为BufferedReader(InputStream)找到合适的构造函数&readLine()给出警告。除了BufferedReader之外,还有其他替代方

  • 我正试图使用ITest接口从数据提供商处获取测试的自定义名称(用于Jenkins reports)。我尝试了下面这样的示例程序,以了解TestNG在什么时候调用gettestname()方法。 粘贴输出和程序。 正如你在下面看到的那样,输出是令人困惑的,有些地方测试名称也是“空”的。所以我的问题是Itest是否被设计用于数据提供商?此外,当我们使用并行=true运行下面的数据提供程序时,它会变得更

  • 我是Vue新手,我有一个网页组件(电影歌曲列表),它从页面路由参数(通过此.$store.state.route.params.movieId)接收电影id,然后使用以下命令从服务器上的数据库获取实际用户歌曲数据:this。movie=(等待MoviesService.show(movieId))。数据,show函数是通过id查找db中的参数,并将内容发送回前端。 我的问题是,每当我点击查看按钮时

  • 问题内容: 如果仅在输出流中调用,则可以保证输出,还是需要始终调用? 问题答案: Close()始终刷新,因此无需调用。 编辑:这个答案是基于常识和我遇到的所有输出流。谁将为缓冲流实现close()而不先刷新缓冲区?在close()之前立即调用flush没有什么害处。但是,如果过度调用flush()会导致后果。它可能会在缓冲机制下失败。