Метод RxJava onNext для Logcat и тостов - PullRequest
0 голосов
/ 11 февраля 2019

Я новичок в RxJava.

Я опираюсь на онлайн-ресурсы и внедряю их.Я пытаюсь кодировать очень простые вещи, но у меня возникают некоторые проблемы.

var animalobservable: Observable<String> = Observable.just("Ant", "Bee", "Cat", "Dog", "Fox")
var animalObserver: Observer<String> = getAnimalObserver()

animalobservable
    .subscribeOn(Schedulers.trampoline())
    .debounce(3, TimeUnit.SECONDS)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(animalObserver)

И я делаю некоторые вещи в методе onNext.

private fun getAnimalObserver(): Observer<String> {
    return object : Observer<String> {
        override fun onSubscribe(d: Disposable) {
            Log.d("OnSubscibe", "onSubscribe")
        }

        override fun onNext(s: String) {
            Log.d("OnNext", "Name: $s")
            Toast.makeText(context, "Name : $s", Toast.LENGTH_SHORT).show()
        }

        override fun onError(e: Throwable) {
            Log.e("OnError", "onError: " + e.message)
        }

        override fun onComplete() {
            Log.d("OnComplete", "All items are emitted!")
        }
    }
}

Моя проблема когда я печатаю какой-то код в Logcat, он работает нормально.Данные отправляются по одному правильно.

Но когда я делаю тост вместо Logcat, он выдает только последние данные "лиса".

Я хочу знать, что происходит с тостами и logcat.Я предполагаю, что это происходит из-за многопоточности, но я не понимаю, почему это происходит.

Заранее спасибо ..!

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Вы можете увидеть последний тост, потому что тосты сразу показываются последовательно и с одинаковыми временными интервалами друг на друге, только мы можем видеть последний тост.

, но если вы хотите добавить задержку между каждым излучающим элементом,concat animalobservable с наблюдаемой с таким интервалом:

 animalobservable
        .subscribeOn(Schedulers.trampoline())
        .concatMap { animal ->
            Observable.interval(3, TimeUnit.SECONDS).take(1)
                .map { animal }
        }
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(animalObserver)
0 голосов
/ 11 февраля 2019

Попробуйте изменить значение с

Schedulers.trampoline()

на

Schedulers.io()

, поскольку trampoline обычно используется в тестировании (unittest / UItest)

РЕДАКТИРОВАТЬ:

хорошо, когда я перечитываю это, точно так же, как @beigirad, упомянутый ниже, это из-за вашего debounce.Для ведения журнала он работает очень быстро, поэтому все значения могут быть напечатаны в течение 3 секунд.Однако для Toast он намного медленнее, поэтому время истекает и он выдает ваш последний результат.

Если вы хотите сделать интервалы между onNext, вы можете написать так:

animalobservable
    .interval(3, TimeUnit.SECONDS)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(animalObserver)

...