代码之家  ›  专栏  ›  技术社区  ›  Pranav P

logcat和toast的rxjava onnext方法

  •  2
  • Pranav P  · 技术社区  · 7 年前

    我刚接触到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)
    

    我在下一个方法中做了一些事情。

    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”。

    我想知道Toast和Logcat的问题是什么。我假设它是由于线程而发生的,但我不明白为什么会发生。

    事先谢谢….!

    2 回复  |  直到 7 年前
        1
  •  2
  •   beigirad    7 年前

    您可以看到最后一个祝酒词,因为祝酒词会立即按顺序显示,并且彼此的时间相同,只有我们可以看到最后一个祝酒词。

    但是,如果要在每个发射项之间添加延迟,请使用concat animalobservable 以这样的间隔进行观测:

     animalobservable
            .subscribeOn(Schedulers.trampoline())
            .concatMap { animal ->
                Observable.interval(3, TimeUnit.SECONDS).take(1)
                    .map { animal }
            }
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(animalObserver)
    
        2
  •  2
  •   Bach Vu    7 年前

    尝试从更改

    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)