如何解决何时使用withContext?
目前,我的代码看起来像这样,我有一个contato email
ABC/DFG 567tao@lime.com.br
DFG/ABC 567tao@lime.com.br
ABC/DFG/HIJ/KLM 1A3456quim@live.com
DFG/ABC/HIJ/KLM 1A3456quim@live.com
HIJ/ABC/DFG/KLM 1A3456quim@live.com
KLM/ABC/DFG/HIJ 1A3456quim@live.com
ZZZ 387e76@live.com
YYY alanrego@live.com
XXX fivetiago@live.com
,它调用存储库进行一些后台计算并返回结果。
ViewModel函数用ViewModel
运行,然后存储库中的一个是viewModelScope.launch(Dispatchers.IO)
函数。
我是否必须使用return suspend
来确保一切都将按顺序进行?我检查了一下,它确实是顺序的,但是在文档中我发现它不是必须的吗?
解决方法
首先从源代码中剖析viewModelScope
。它使用CouroutineScope
的自定义实现。上下文由SupervisorJob和Dispatchers.Main调度程序组成。这样可以确保协程在主线程上启动,并且它的失败不会影响作用域中的其他协程。
CloseableCoroutineScope(SupervisorJob() + Dispatchers.Main.immediate))
值得一试的例子。
viewModelScope.launch {
Log.d("ViewModel","Just viewModelScope: ${Thread.currentThread().name}")
}
// Output: Just viewModelScope: main
viewModelScope.launch(Dispatchers.IO) {
Log.d("ViewModel","IO viewModelScope: ${Thread.currentThread().name}")
}
// Output: IO viewModelScope: DefaultDispatcher-worker-3
viewModelScope.launch {
Log.d("ViewModel","viewModelScope thread: ${Thread.currentThread().name}")
withContext(Dispatchers.IO) {
delay(3000)
Log.d("ViewModel","withContext thread: ${Thread.currentThread().name}")
}
Log.d("ViewModel","I'm finished!")
}
// Output:
// viewModelScope thread: main
// withContext thread: DefaultDispatcher-worker-4
我检查了一下,它确实是顺序的,但是在文档中我 发现不是必须的。
withContext()
是一个暂停操作,协程将暂停直到完成为止,然后继续进行。从上面的第三个示例中可以明显看出。
总而言之,viewModelScope
将使用主线程执行一个协程,该协程的取消不会影响其他协程。当您想以挂起方式在主线程上完成繁重的任务时,请使用withContext
;使用适当的调度程序进行调度。 Kotlin Coroutine guide值得一读。
编辑:
将以下代码视为单个执行单元。这说明了一个事实,当使用withContext()
时,调用者线程正在挂起,但未被阻塞,这使它可以继续进行其他未完成的工作。输出记录器的交错是我们感兴趣的。
viewModelScope.launch {
Log.d("ViewModel","I'm finished!")
}
viewModelScope.launch {
Log.d("ViewModel","I'm not blocked: ${Thread.currentThread().name}")
}
// Output:
// viewModelScope thread: main
// I'm not blocked: main
// withContext thread: DefaultDispatcher-worker-2
// I'm finished!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。