Как обрабатывать все 5 потоков в RxJava - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть простой класс Kotlin, у которого есть одно "ленивое" свойство.Я эмулирую, что это свойство берет имя пользователя из сети и возвращает Observable.

После этого я пытаюсь получить это свойство 5 раз и получить неожиданный результат.

Вот исходный код примеракласс (Kotlin):

class LazyInitialization {

    private val username by lazy {
        println("lazy init started")
        Thread.sleep(2000)
        println("lazy init finished")
        Observable.just("username")
    }


    fun print(number: Int) {
        println("Print started [$number]")
        username.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe {
            println("Return preference: [$it]")
        }
    }
}

Это пример, как я это называю (Java):

LazyInitialization lazyInitialization = new LazyInitialization();
for (int i = 0; i < 5; i++) {
    lazyInitialization.print(i);
}

Вывод:

I/System.out: Print started [0]
I/System.out: lazy init started
I/System.out: lazy init finished
I/System.out: Print started [1]
I/System.out: Print started [2]
I/System.out: Print started [3]
I/System.out: Print started [4]
I/System.out: Return preference: [username]
I/System.out: Return preference: [username]

Как видитепредпочтение возвращается два раза, но должно возвращать значение 5 раз.

И еще один странный момент: если я улучшу вывод (добавлена ​​печать числа)

println("Return preference: [$number] [$it]")

, так выглядит метод print ()вот так:

fun print(number: Int) {
        println("Print started [$number]")
        username.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe {
            println("Return preference: [$number] [$it]")
    }
}

тогда я получил ожидаемый результат:

I/System.out: Print started [0]
I/System.out: lazy init started
I/System.out: lazy init finished
I/System.out: Print started [1]
I/System.out: Print started [2]
I/System.out: Print started [3]
I/System.out: Print started [4]
I/System.out: Return preference: [0] [username]
I/System.out: Return preference: [1] [username]
I/System.out: Return preference: [2] [username]
I/System.out: Return preference: [3] [username]
I/System.out: Return preference: [4] [username]

Также я не понимаю причину, по которой это происходит.

Есть ли у кого-нибудь какие-либо мысли по поводутакое поведение?

...