为什么在RxAndroid中使用compose在io线程中运行而在主线程中运行?

问题描述 投票:0回答:1

我有这段代码,当我使用map进行转换时,您可以看到currentThread是背景线程,而我在主线程中使用compose()时,它是后台线程。为什么这样工作,而我找不到与此有关的文档。

public Single<Content> fetchContent() {
    return mEndpoint.content(id);
}


public Single<Content> fetchContent() {
    return mEndpoint.fetchContent()
            .map(content -> {
                Log.i("thread-name", "map" + Thread.currentThread());
                return content;
            })
            .compose(content -> {
                Log.i("thread-name", "compose" + Thread.currentThread());
                return content;
            });
}

//thread-name: compose. Thread[main,5,main]
//thread-name: map. Thread[OkHttp ...,10,main]


android rx-java2 rx-android
1个回答
0
投票

如注释compose中所述,将立即执行lambda,因此print语句在主线程上运行。

但是,compose的参数实际上是可观察到的,它将发出content,而不是内容本身。因此,您实际上想要像正常的可观察对象一样对其进行操作。例如,这是一个不会在主线程上运行的map函数:

mEndpoint.fetchContent()
        .map(content -> {
            Log.i("thread-name", "map" + Thread.currentThread());
            return content;
        })
        .compose(content -> content.map(it -> {
           Log.i("thread-name", "map" + Thread.currentThread());

           return it;
        }))

请注意,我将变量名content保持不变,因此您可以轻松看到差异,但实际上它应该更像这样:

.compose(obs -> obs.map(content -> {
           Log.i("thread-name", "map" + Thread.currentThread());

           return content;
        }))

最后一件事,当我有多个可应用于可观察对象的操作并在其他链中复用时,通常会使用compose。对于简单的映射,我通常坚持使用map和朋友。

© www.soinside.com 2019 - 2024. All rights reserved.