所以我已经使用 RxJava 一段时间了,在过去的几个月里,我注意到 Lollipop 之前的设备上的日志中有很多 StackOverflowErrors。
经过一些研究后,我创建了一个单独的项目来重现这种情况(我使用的是 Retrofit、RxJava 和 Retrolamba)。
我创建了一个流,它进行 10 次数据调用并进行改造。在 pre lollipop 上,这会给我一个 StackOverflowError 而 >= lollipop 它不会。我的电话看起来像这样:
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)
它神奇地起作用了。谁能向我解释这种行为?
最佳答案
delay
将使用 Schedulers.computation()
来安排排放,因此调用链被打破并且堆栈溢出不会发生。
尽量避免长链调用。在上面的示例中,您可以对 Observable.range(1,10).reduce(...)
执行相同的操作。
关于android - 有人可以向我解释这种 Rxjava 行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39706457/