gpt4 book ai didi

android - 在主线程上运行可观察到的协程或rx有什么作用

转载 作者:行者123 更新时间:2023-12-02 12:46:30 24 4
gpt4 key购买 nike

在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线程中使用。

只要代码不阻塞主线程,在主线程上运行代码就没有问题,这通常意味着“不执行磁盘或网络IO”。

关于android - 在主线程上运行可观察到的协程或rx有什么作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58578930/

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