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方法何时调用

最佳答案

文档说-

onStart-


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


延迟订阅:


  返回一个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调用消耗掉的所有元素。

10-07 19:25
查看更多