【问题标题】:Why in RxAndroid using compose running in main thread while using map running in io thread?为什么在 RxAndroid 中使用 compose 在主线程中运行,而在 io 线程中使用 map 运行?
【发布时间】:2020-03-09 22:01:17
【问题描述】:

我有这段代码,当我使用 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 函数在创建时被调用/评估,而不是订阅,因此它在主线程上被调用,以及为什么它会立即记录。
  • 感谢您的回答。我不确定我是否理解答案。
  • 是否可以在撰写和后台线程中进行转换?

标签: android rx-java2 rx-android


【解决方案1】:

如 cmets 中所述,compose 将立即执行 lambda,因此打印语句在主线程上运行。

然而,compose 的参数实际上是发出 content 的 observable,而不是内容本身。所以你实际上想像普通的 observable 一样对其进行操作。例如,下面是一个不会在主线程上运行的地图函数:

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 和朋友。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    相关资源
    最近更新 更多