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
方法
答案 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
次调用消耗的所有元素。