
RxJava 1.0
至
RxJava 2.0
的迁移指南
|
297
compute(v);
}
但是,onStart 的情况并非如此。尽管 Flowable 的基础设施能够确保在每个 Subscriber
上最多只调用一次,对 request(1) 的调用可能会立即触发元素的发布。如果在调用
request(1) 后面有 onNext 需要的初始化逻辑,那么可能会出现异常。
Flowable.range(1, 1_000_000)
.subscribe(new DisposableSubscriber<Integer>() {
String name;
@Override
public void onStart() {
request(1);
name = "RangeExample";
}
@Override
public void onNext(Integer v) {
compute(name.length + v);
request(1);
}
//……剩余内容是相同的
});
在这个同步的场景中,执行 onStart 的时候会立即抛出 NullPointerException。如果对
request(1) 的调用触发了其他线程上对 onNext 的异步调用,在 onNext 中读取 name 与在
onStart 中写入 name 竞争公布 request,这样可能会产生更诡异的
bug
。
因此,我们应该在 onStart 或更早的地方完成所有字段的初始化,最后再调用 ...