作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在Kotlin中,通过指示要使用的调度程序(IO,Main等)来指定要在其上运行代码的线程类型。以类似的方式,使用rxJava,您还可以指示要在哪个线程上运行。但是,使用rxJava时,通常将在IO线程上运行某些操作来执行后台工作,然后切换到主线程(即UI线程)以显示内容。
但是我看过很多代码,其中协程仅使用主线程。它不会从IO线程切换到主线程。尽管我确定它存在,但我还没有在rxJava中看到它。
但是我的问题是你为什么要这样做?如果您只打算使用主线程,那为什么还要使用协程或rxJava呢?在主线程上运行协程是否与在没有协程的情况下在主线程上运行相同?
最佳答案
I have seen a lot of code where a coroutine uses only the main thread.
Dispatchers.IO
)上运行的代码,但它通常在“幕后”进行。例如,考虑以下来自
Android docs的代码:
suspend fun fetchDocs() {
val result = get("https://developer.android.com")
show(result)
}
get()
的实现时,您会发现它确实可以切换线程:
suspend fun get(url: String) = withContext(Dispatchers.IO) { /* ... */ }
Dispatchers.IO
)(否则像您指出的那样使用协程毫无意义)。
But my question is why would you do this?
viewModelScope
)默认使用
Dispatchers.Main
的原因是因为这样您就不必担心“顶级代码”的线程安全性。通常的模式是“在
Dispathers.Main
上运行所有协程,但是在必要时切换到例如
Dispathers.IO
以便不阻塞
Main
线程”。
show(result)
方法不需要是线程安全的,因为它将仅在
Main
线程中使用。
关于android - 在主线程上运行可观察到的协程或rx有什么作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58578930/
我是一名优秀的程序员,十分优秀!