有人可以向我解释这个Rxjava行为吗?

时间:2016-09-26 15:13:40

标签: android retrofit rx-java

所以我一直在使用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)

它只是神奇地起作用。任何人都可以向我解释这种行为吗?

1 个答案:

答案 0 :(得分:1)

delay将使用Schedulers.computation()来安排排放,以便调用链断开并且不会发生堆栈溢出。

尽量避免长链电话。在上面的示例中,您可以使用Observable.range(1,10).reduce(...)执行相同操作。