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 三(生命周期控制和内存优化)