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