Logcat和Toast的RxJava onNext方法

时间:2019-02-11 04:11:47

标签: android multithreading observable rx-java reactive-programming

我是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时,它仅发出最后一个数据“ fox”。

我想知道烤面包和logcat发生了什么问题。我假设它是由于线程而发生的,但我不知道为什么会发生。

提前谢谢..!

2 个答案:

答案 0 :(得分:2)

尝试从以下位置更改

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)

答案 1 :(得分:2)

您可以看到最后的吐司,因为这些吐司会立即按顺序显示并且彼此之间具有相同的时间,只有我们才能看到最后的吐司。

但是,如果要在每个发射项之间添加延迟,请使用可观察的时间间隔将concat animalobservable连接起来,如下所示:

 animalobservable
        .subscribeOn(Schedulers.trampoline())
        .concatMap { animal ->
            Observable.interval(3, TimeUnit.SECONDS).take(1)
                .map { animal }
        }
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(animalObserver)