带有delaySubscription的rxjava onStart事件

时间:2017-01-21 13:18:36

标签: java android rx-java

Observable.create(new Observable.OnSubscribe<Integer>() {
    @Override
    public void call(Subscriber<? super Integer> subscriber) {
        subscriber.onStart();
        subscriber.onNext(1);
        subscriber.onCompleted();
    }
}).delaySubscription(5, TimeUnit.SECONDS).subscribe(new Subscriber<Integer>() {
    @Override
    public void onCompleted() {
        Log.e("TAG", String.format("(%s) - onCompleted", System.currentTimeMillis()));
    }

    @Override
    public void onError(Throwable e) {
        Log.e("TAG", String.format("(%s) - onError", System.currentTimeMillis()), e);
    }

    @Override
    public void onNext(Integer integer) {
        Log.e("TAG", String.format("(%s) - onNext: %s", System.currentTimeMillis(), integer));
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.e("TAG", String.format("(%s) - onStart", System.currentTimeMillis()));
    }
});

输出:

(1485004553817) - onStart
(1485004558818) - onNext: 1
(1485004558819) - onCompleted

为什么onStart事件不等待delaySubscription并且很快就会召唤?

我想知道何时调用call方法

1 个答案:

答案 0 :(得分:2)

文件说 -

onStart -

  

当Subscriber和Observable已连接但Observable尚未开始发出项目或向订阅者发送通知时,将调用此方法。

delaySubscription:

  

返回一个Observable,它将对源Observable的预订延迟一段给定的时间。

只有在实现订阅时才会调用

onNext。 onStart在建立连接的那一刻被称为。因此,它根据定义按预期工作。

您可以尝试评论代码subscriber.onStart();并再次执行相同的操作以注意仍然在开始时调用onStart。故意执行并没有真正调用所述方法,因为这不是在我们创建的真实订阅者上执行的,而是由delaySubscription(类型为OnSubscribeDelaySubscription)的结果执行的。

以下是一个片段,它可以帮助您实现所需的目标:

   public static void main(String[] args) throws UnsupportedEncodingException, IOException {
      Observable.timer(5, TimeUnit.SECONDS).flatMap(val -> {
          System.out.println("Initialize");
          return Observable.create(subscriber -> {
              System.out.println("onsubscribe");
              doMyAsyncStuff(subscriber);
          });
      }).subscribe(val -> System.out.println(val));

      Observable.timer(10, TimeUnit.SECONDS).toBlocking().first();
   }

我们初始化timer,一旦执行了计时器,我们在flatMap中执行一些任务,这应该与您之前使用onStart执行的任务相同。执行该任务后,我们会发出Observable,其中会发出您之前使用onNext次调用消耗的所有元素。