Rx java 完成事件时样本不停止

Rx java 完成事件时样本不停止,rx-java,Rx Java,我正在执行212/213页书中的一个示例: Observable<String> names = Observable .just("Mary", "Patricia", "Linda", "Barbara", "Elizabeth", "Jennifer", "Maria", "Susan", "Margaret", "Dorothy"); Observable<Long> absolute

我正在执行212/213页书中的一个示例:

Observable<String> names = Observable
        .just("Mary", "Patricia", "Linda", "Barbara",
                "Elizabeth", "Jennifer", "Maria", "Susan",
                "Margaret", "Dorothy");
Observable<Long> absoluteDelayMillis = Observable
        .just(0.1, 0.6, 0.9, 1.1,
                3.3, 3.4, 3.5, 3.6,
                4.4, 4.8)
        .map(d -> (long) (d * 1_000));
Observable<String> delayedNames = names
        .zipWith(absoluteDelayMillis,
                (n, d) -> Observable
                        .just(n)
                        .delay(d, TimeUnit.MILLISECONDS))
        .flatMap(o -> o);
delayedNames
        .sample(1, SECONDS)
        .subscribe(System.out::println);
根据这本书(以及我的想法),
Dorothy
不应该在那里,因为
sample()
应该转发完成事件@4.8s

我正在使用rxjava1.1.6运行这个示例


我遗漏了什么?

这本质上是由RxJava的一个bug引起的,该bug已在2.0版本中删除。您对示例运算符的理解是正确的。

sample
是一种计时器,它会在每一个特定的时间点进行计时,并从“缓冲区”中选取最后一项

在您的情况下,如果您将修改您在以下方面的最后一次观察:

long time = System.currentTimeMillis();
delayedNames
        .doOnNext(n -> System.out.println(String.format("%s - %d", n, (System.currentTimeMillis() - time))))
        .sample(1, SECONDS)
        .doOnCompleted(() -> System.out.println(String.format("complete - %d", (System.currentTimeMillis() - time))))
        .subscribe(System.out::println);
您将看到类似这样的输出:

Mary-155
Patricia-657
Linda-959
Linda
Barbara-1156
Barbara
Elizabeth-3355
Jennifer-3460
Maria-3558
Susan-3658
Susan
Margaret-4460
Dorothy-4856
Dorothy
complete - 4852
让我们一步一步走

  • 第一个勾号出现在
    1000
    。正如您在输出中看到的,缓冲区中的最后一项是
    Linda
  • 第二次滴答声发生在
    2000
    。只有
    Barbara
    在缓冲区中。打印它
  • 第三个勾号出现在
    3000
    。缓冲区中没有任何内容
  • 第四个勾号出现在
    4000
    Susan
    是缓冲区中的最后一个。印刷
  • 第五个勾号出现在
    5000
    Dorothy
    是缓冲区中的最后一个。印刷
UPD:

实际上,
5000
上没有勾号,似乎
sample
将始终发出缓冲区中的最后一项。例如,如果要修改源观测值:

    Observable<String> names = Observable
            .just("Mary", "Patricia", "Linda", "Barbara",
                    "Elizabeth", "Jennifer", "Maria", "Susan");
    Observable<Long> absoluteDelayMillis = Observable.just(0.1, 0.6, 0.9, 1.1, 3.3, 3.4, 3.5, 3.6)
UPD2:

我创造了

UPD3:


我已经检查过了,在rxjava2中它的工作情况与预期一样。

为了澄清,这不是RxJava1.x的错误,因为这是在2016年初出现的错误

然而,这在RxJava2.x中被忽略了,从2.0.4开始,它不会发出最后一个缓冲项,就像1.1.3之前的版本一样


不幸的是,没有解决办法,但是有一个POST允许选择
示例的模式

,我也认为这是一个错误,因为根据中的mable图,最后一项不应该发出。这是RxJava 1.1.6中的一个错误-只是它不在代码中,而是在的java文档中。另外,这本书是错误的,因为它提到所有示例都应该使用RxJava 1.1.6(除非另有说明,本例并非如此)。
    Observable<String> names = Observable
            .just("Mary", "Patricia", "Linda", "Barbara",
                    "Elizabeth", "Jennifer", "Maria", "Susan");
    Observable<Long> absoluteDelayMillis = Observable.just(0.1, 0.6, 0.9, 1.1, 3.3, 3.4, 3.5, 3.6)
Mary - 153
Patricia - 654
Linda - 957
Linda
Barbara - 1157
Barbara
Elizabeth - 3358
Jennifer - 3457
Maria - 3559
Susan - 3658
Susan
complete - 3659