我正在学习RxJava异步订阅的工作原理。但是有些问题使我感到困惑。
@Test public void testCreateAsync() throws InterruptedException {
Observable<String> observable = Observable.create(emitter -> {
for (int i = 0; i < 10; i++) {
if (!emitter.isDisposed()) {
int finalI = i;
new Thread(() -> emitter.onNext("value_" + finalI)).start();
}
}
if (!emitter.isDisposed()) {
emitter.onComplete();
}
});
observable.subscribe(System.out::println);
}
上述代码运行正常,并将value_1
打印到value_9
。但是当我在订阅之前添加一个睡眠时,最后一条消息value_9
将不会被打印出来,如下所示:
@Test public void testCreateAsync() throws InterruptedException {
...
Thread.sleep(3000);
observable.subscribe(System.out::println);
}
有关此问题的任何讨论都表示赞赏。
ps:java版本为1.8
,RxJava版本为2.1.1
。
答案 0 :(得分:0)
有两个问题:
onNext
onComplete
可以在之前的线程能够发出其值以防止任何进一步的onNext
发射之前执行。睡眠没有特别的影响,重复执行上面的代码有时会产生这种行为。
(我不清楚你想通过这种设置实现什么目标。)