我有这段代码,当我使用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]
如注释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
和朋友。