Logcat 和 toast 的 RxJava onNext 方法
RxJava onNext method for Logcat and toast
我是 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 时它工作正常。数据一一正确发出。
但是当我 toast 它而不是 Logcat 时,它只发出最后的数据 "fox"。
我想知道 toast 和 logcat 发生了什么问题。我假设它是由于线程而发生的,但我不明白为什么会发生。
提前致谢..!
尝试更改
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)
你可以看到最后的祝酒词,因为祝酒词是立即按顺序显示的,并且彼此的时间相同,只有我们能看到最后的祝酒词。
但是如果你想在每个发射项之间添加延迟,concat animalobservable
与一个具有间隔的可观察对象,如下所示:
animalobservable
.subscribeOn(Schedulers.trampoline())
.concatMap { animal ->
Observable.interval(3, TimeUnit.SECONDS).take(1)
.map { animal }
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe(animalObserver)
我是 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 时它工作正常。数据一一正确发出。
但是当我 toast 它而不是 Logcat 时,它只发出最后的数据 "fox"。
我想知道 toast 和 logcat 发生了什么问题。我假设它是由于线程而发生的,但我不明白为什么会发生。
提前致谢..!
尝试更改
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)
你可以看到最后的祝酒词,因为祝酒词是立即按顺序显示的,并且彼此的时间相同,只有我们能看到最后的祝酒词。
但是如果你想在每个发射项之间添加延迟,concat animalobservable
与一个具有间隔的可观察对象,如下所示:
animalobservable
.subscribeOn(Schedulers.trampoline())
.concatMap { animal ->
Observable.interval(3, TimeUnit.SECONDS).take(1)
.map { animal }
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe(animalObserver)