RxJava/RxAndroid 中的 Schedulers.computation() v/s Schedulers.io()

Posted

技术标签:

【中文标题】RxJava/RxAndroid 中的 Schedulers.computation() v/s Schedulers.io()【英文标题】:Schedulers.computation() v/s Schedulers.io() in RxJava/RxAndroid 【发布时间】:2021-10-17 22:12:08 【问题描述】:

我已经阅读了很多关于 SO 的答案,例如 use-cases-for-rxjava-schedulers、what-is-the-difference-between-schedulers-io-and-schedulers-computation、rxjava2-schedulers-io-vs-schedulers-computation-with-large-concurrent-request。

最常见的解释是使用 Schedulers.computation() 处理 CPU 密集型工作

并使用 Schedulers.io() 与文件系统交互、与数据库或服务交互、REST API 调用

通过 CPU 密集型工作,我假设/考虑图像调整大小/操作、大型数据集等。(如果您知道任何通常在 android 应用上执行的任务,请添加一些其他 CPU 密集型任务)

我的问题是

    什么是 Android 中的大型数据集? (有形的感觉) 如果对数据库的网络调用或查询以庞大的数据集响应(根据问题 1),那么会怎样?

【问题讨论】:

为什么要投反对票? “什么是 Android 中的大型数据集?” ——你必须问自己这个问题。毕竟,您是使用“大型数据集”的人。没有人能告诉你你认为这意味着什么。 “如果网络调用或对数据库的查询以庞大的数据集响应(根据问题 1),那会怎样?” -- 如果需要,切换调度程序。一个 RxJava 链可以在一个调度器上做一些工作,然后切换调度器。 【参考方案1】:

事实上,它们只是使用不同的线程池,因此需要用于它们的预期目的。

对于数据处理,需要使用Schedulers.computation(),对于数据输入输出需要Schedulers.io()

这样做是为了限制无限新线程的创建,从而创建一个作业队列。

【讨论】:

【参考方案2】:

来自documentation of rx:

Schedulers.computation( ) - 用于计算工作,例如事件循环和回调处理;不要将此调度程序用于 I/O(使用 Schedulers.io() 代替);默认情况下,线程数等于处理器数

Schedulers.io( ) - 用于 I/O 密集型工作,例如阻塞 I/O 的异步性能,此调度程序由一个线程池支持,该线程池将根据需要增长;对于普通的计算工作,切换到 Schedulers.computation(); Schedulers.io() 默认是一个CachedThreadScheduler,有点像一个带有线程缓存的新线程调度器

【讨论】:

以上是关于RxJava/RxAndroid 中的 Schedulers.computation() v/s Schedulers.io()的主要内容,如果未能解决你的问题,请参考以下文章

谁来讲讲Rxjava,rxandroid中的操作符的作用

谁来讲讲Rxjava,rxandroid中的操作符的作用

RxJava 和 RxAndroid 三(生命周期控制和内存优化)

Android RxJava/RxAndroid结合Retrofit使用

综合开源框架之RxJava/RxAndroid

markdown 派对技巧与RxJava,RxAndroid和Retrolambda