所以我一直在使用RxJava,最近几个月在棒棒糖设备上的日志中发现了很多StackOverflowErrors。
经过一番研究后,我创建了一个单独的项目来重新创建情境(我使用Retrofit,RxJava和Retrolamba)。
我创建了一个通过改造进行10次数据调用的流。在棒棒糖前,这将给我一个StackOverflowError和> =棒棒糖它赢了。我的电话看起来像这样:
public Observable<MyModel> myDataCall() {
return api.getApi("http://myfile.json");
}
我的信息流看起来像这样:
myDataCall().flatMap(myModel -> myDataCall())
.flatMap(myModel -> myDataCall())
.flatMap(myModel -> myDataCall())
.flatMap(myModel -> myDataCall())
.flatMap(myModel -> myDataCall())
.flatMap(myModel -> myDataCall())
.flatMap(myModel -> myDataCall())
.flatMap(myModel -> myDataCall())
.flatMap(myModel -> myDataCall())
.flatMap(myModel -> myDataCall())
.flatMap(myModel -> myDataCall())
.flatMap(myModel -> myDataCall())
.compose(applyObsSchedulers()).subscribe(o -> {
Log.d("done", "done");
}, throwable -> {
Log.d("error", "error");
});
public static <T> Observable.Transformer<T,T> applyObsSchedulers() {
return s -> s.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
}
现在最奇怪的是,在myDataCall()函数中,我在最后添加以下行:
.delay(0, TimeUnit.MILLISECONDS)
它只是神奇地起作用。任何人都可以向我解释这种行为吗?
答案 0 :(得分:1)
delay
将使用Schedulers.computation()
来安排排放,以便调用链断开并且不会发生堆栈溢出。
尽量避免长链电话。在上面的示例中,您可以使用Observable.range(1,10).reduce(...)
执行相同操作。