为什么有些rxjava运算符有调度程序参数而有些没有?

时间:2017-10-31 19:14:12

标签: rx-java

我浏览了rxjava 1的文档,以下运算符包含调度程序参数的变体: 缓冲 防抖动 延迟 Delaysubscription 从 间隔 范围 重复 repeatWhen 重播 retrywhen 样品 跳跃 skiplast

有人可以解释这些而不是其他人的理由吗?

2 个答案:

答案 0 :(得分:3)

需要时间或具有异步方面的运算符采用Scheduler参数,允许您自定义运算符执行其工作的位置。通常,为方便起见,存在使用默认Scheduler的重载。

Scheduler是异步边界的抽象,它提供执行任务Runnable s,有或没有延迟,并提供当前时间的概念。这种抽象允许使用非真正异步的Scheduler甚至执行具有实时延迟的任务:例如trampoline调度程序和TestScheduler

它们构成了通过observeOn在流中切换线程的非阻塞基础,并提供延迟任务的非阻塞执行,例如在一段时间后启动新缓冲区或定期发出值。没有它们,你必须求助于Thread.sleep()然后阻塞当前线程并可能浪费它。

如果您必须与非反应源或API进行交互,那么这些API可能会自行阻塞:从磁盘读取字节,等待套接字的InputStream等等。Scheduler s让你从一些线程中移出这个阻塞,例如Android主线程或Swing事件调度线程,它们释放这些线程来执行它们的主要任务:渲染用户界面并对用户输入作出反应。

因此,当您看到Scheduler参数时,它可能意味着:

  • 事件/流程管理应该在不同的线程上进行(observeOnsubscribeOn),
  • 需要时间信息(replay,使用TestScheduler进行测试),
  • 事件应该随着时间的推移而发生,影响主流(缓冲时间,在一些安静的时间后发出事件),或
  • 避免阻止当前线程from Future,一个包含在Observable中的非反应性API。)

答案 1 :(得分:0)

似乎提供了具有调度程序参数的变体,可能存在阻塞(虽然我不清楚为什么我们需要这些变量,因为我们有observeOn。)