FlowableOnBackpressureDrop忽略Subscription的请求方法

时间:2016-09-23 04:53:16

标签: rx-java

我在下面试过

Flowable.interval(100L, TimeUnit.MILLISECONDS)
    .onBackpressureDrop()
    .observeOn(Schedulers.computation())
    .subscribe(new Subscriber<Long>() {

      private Subscription subscription;

      @Override
      public void onSubscribe(Subscription subscription) {
        this.subscription = subscription;
        this.subscription.request(1L);
      }

      @Override
      public void onNext(Long t) {
        try {
          Thread.sleep(300L);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }

        System.out.println(t);

        subscription.request(1L);
      }

      ...
    });

我预计我会得到类似0,3,6的东西...... 但是,我得到0,1,2,3 ...... 因为Flowable最初得到request(Long.MAX_VALUE)

我检查了FlowableOnBackpressureDrop并找到了

    @Override
    public void onSubscribe(Subscription s) {
        if (SubscriptionHelper.validate(this.s, s)) {
            this.s = s;
            actual.onSubscribe(this);
            s.request(Long.MAX_VALUE);
        }
    }

由于我没有使用我在请求方法上设置的值, 我认为背压不起作用。

这是一个错误还是一个正确的行动?

我试过RxJava 2.0.0-RC2和RC3

1 个答案:

答案 0 :(得分:1)

observeOn提前请求和缓冲128个元素,因此在开始的一段时间内没有任何内容可以删除。如果你让它运行128 * 300ms,它将开始跳过值。您可以将带有重载的预取量设置为1,并且可以非常快速地查看值。