当前位置: 首页 > 知识库问答 >
问题:

RxJava-延迟和延迟订阅之间的区别是什么?

萧宏远
2023-03-14

我试图理解延迟和延迟订阅操作符之间的区别。

文件描述了延迟操作员:

延迟操作符通过在发出每个源可观察项之前暂停特定的时间增量(您指定)来修改其源可观察项。这会将可观测项发出的整个项目序列在时间上向前移动指定的增量

delaySubscription是这样描述的:

还有一个操作符,您可以使用它延迟对源可观察对象的订阅:delaySubscription。

然而,当我测试这两个操作员的行为时,我觉得他们的工作方式是一样的。

这是我观察到的:

Observable observable = Observable.just(5, 3, 4, 2);

这里我使用延迟运算符:

observable = observable.delay(3, TimeUnit.SECONDS);

这是我的观察者,当它的一个方法被调用时,它会记录日志

Observer observer = new Observer() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d("RxJavaTag", "onSubscribe");
            }

            @Override
            public void onNext(Object o) {
                Log.d("RxJavaTag", "onNext: " + o);
            }

            @Override
            public void onError(Throwable e) {
                Log.d("RxJavaTag", "onError:" + e.toString());
            }

            @Override
            public void onComplete() {
                Log.d("RxJavaTag", "onComplete");
            }
        };

这里,观察者订阅了Observable:

observable.subscribe(observer);

因此,当我使用延迟操作符时,我得到以下日志:

03-25 17:45:34.156 onSubscribe
03-25 17:45:37.160 onNext: 5
03-25 17:45:37.160 onNext: 3
03-25 17:45:37.160 onNext: 4
03-25 17:45:37.160 onNext: 2
03-25 17:45:37.160 onComplete

以及使用delaySubscription运算符时的以下日志:

03-25 17:49:22.540 onSubscribe
03-25 17:49:25.544 onNext: 5
03-25 17:49:25.544 onNext: 3
03-25 17:49:25.544 onNext: 4
03-25 17:49:25.544 onNext: 2
03-25 17:49:25.544 onComplete

正如您在日志中看到的,它们的工作方式相同。我无法理解它们之间的区别。我试图用ConnectableWatable测试它——相同的行为。

根据我的理解,正如其名称所示,不应以这种方式延迟订阅运营商的工作:

[SOME DELAY - FOR EXAMPLE 3 SECONDS]
03-25 17:49:25.540 onSubscribe
03-25 17:49:25.544 onNext: 5
03-25 17:49:25.544 onNext: 3
03-25 17:49:25.544 onNext: 4
03-25 17:49:25.544 onNext: 2
03-25 17:49:25.544 onComplete

也许我做错了什么,但我无法理解其中的区别。你能解释一下延迟和延迟订阅的区别吗?

共有3个答案

陆绪
2023-03-14

当你看到操作符一个接一个的时候,这是非常清楚的(就像你贴的那样)。通常,当订阅延迟时,您会“松开”红色和橙色大理石。与延迟相比,延迟只会给你带来延迟。

祖利
2023-03-14

延迟订阅仅影响初始订阅。在订阅了下游可观察到的后,它就正常工作了。

延迟对下一个、完成的和错误的事件起作用,将这些事件延迟指定的时间量,但保持它们之间的相对延迟不变。

如果您使用比O更不可预测的源代码,差异会更明显bservable.just

池砚文
2023-03-14

你可以把这想象成一场足球比赛的流,源发出帧[一个热的可见光]。

假设实时流场景...在延迟(3秒)的情况下,一旦您打开频道,您将被订阅,但将在实际发射3秒后收到第一帧,因此您将继续观看游戏延迟3秒。

delaySubscription(3秒)的情况下,一旦您打开频道,您将等待3秒(错过这3秒内发出的任何帧),然后订阅并开始实时接收其余帧

 类似资料:
  • 我正在使用Cassandra 2.2并使用可插拔指标将Cassandra指标发送到Graphite, > 我在组织.apache.cassandra.metrics.Column家庭中搜索过,看到在“排量”和“读数总计”中都有一个属性“计数”,这两个计数属性之间有什么区别? 我的主要目标是获得每次读/写的延迟,您如何建议我获得它? 谢谢!

  • 我有几个。Net 5.0微服务,RabbitMQ作为消息代理。现在我正在切换到AWS SQS。很少有服务在侦听相同的消息(这是通过RabbitMQ中的Exchange完成的)。在AWS中,这可以通过将SQS队列订阅到SNS主题来实现。我创建了SNS fifo topic和SQS fifo队列,将这些队列订阅到topic。当我将消息直接发布到队列时,一切都会立即工作,但当我将消息发布到SNS主题时,

  • 问题内容: 在以下情况下,实现C ++ / Java IPC的最佳方法是什么? 我有两个程序需要相互通信,一个是用C ++编写的,另一个是用Java编写的。两者都在同一台计算机上运行。 程序相互发送消息。消息通常很短(少于几百个字节),但是大小可能为100KB或更大。 不需要确认消息(即不需要像HTTP这样的请求/响应模型)。例如,C 程序向Java程序发送一条消息,而Java程序可以在以后的某个

  • 问题内容: 我正在尝试使用新的React Lazy和Suspense创建后备加载组件。这很好用,但后备时间仅显示几毫秒。有没有办法增加额外的延迟或最短时间,因此我可以在渲染下一个组件之前显示该组件的动画? 现在懒导入 等待组件: 我可以做这样的事情吗? 问题答案: 函数应该返回对象的承诺,该对象由具有默认导出功能的模块返回。不会返回承诺,也不能那样使用。尽管任意承诺可以: 如果目标是提供 最小的

  • 问题内容: 我需要在循环中对数据库进行SQL查询: 更好的方法是:保持原样或循环后移动: 或者是其他东西 ? 问题答案: 整个要点是直到函数返回才执行,因此将其放置在要关闭的资源打开后的适当位置。但是,由于要在循环内创建资源,因此根本不要使用defer- 否则,在函数退出之前,您不会关闭在循环内创建的任何资源,因此它们会堆积直到然后。相反,您应该在每次循环迭代结束时关闭它们, 而无需 :

  • 问题内容: 我想知道一段时间后如何调用函数。我已经尝试过time.sleep(),但是这会暂停整个脚本。我希望脚本继续进行,但是??? secs之后调用一个函数并同时运行其他脚本 问题答案: 看一看。它在新线程中运行您的函数。