Почему в Rx Android используется compose, работающий в основном потоке, а карта работает в io-потоке? - PullRequest
0 голосов
/ 10 марта 2020

У меня есть этот фрагмент кода, который вы можете видеть, когда я использую 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]


1 Ответ

1 голос
/ 11 марта 2020

Как объяснено в комментариях compose сразу выполнит лямбду, и, следовательно, оператор print выполняется в главном потоке.

Однако аргумент compose на самом деле является наблюдаемым, который будет излучать content, а не сам контент. Таким образом, вы действительно хотите оперировать этим, как обычная наблюдаемая. Вот, например, функция карты, которая не будет работать в главном потоке:

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 и друзей.

...