android - 有人可以向我解释这种 Rxjava 行为吗?

标签 android retrofit rx-java

所以我已经使用 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/

相关文章:

Android Volley 库 : How to send an image to server?

javax.net.ssl.SSLHandshakeException : Trust anchor for certification path not found

java - 图像文件无法使用改造 2 后方法发送到服务器

java - 仅当其他方法完成时才调用方法 - RxJava

android - 我怎样才能显示一个中间有加号的空 ImageView

android - ADB 在 android studio 1.2 中没有响应?

android - 内容提供者和图像存储

android - 将 Retrofit 实例保存在内存中是一种好习惯吗?

java - 如何创建从BehaviorSubject发射一次项目然后onComplete的Observable?

android - RXJava - 制作一个可暂停的可观察对象(例如使用缓冲区和窗口)