通常调用回调方法将事件转发给Observable?

时间:2016-12-02 01:22:38

标签: android rx-java kotlin rx-java2

所以我在自定义滑块视图上有这个监听器。当用户滑动滑块时,视图会调用onSliderChanged(int percent)。我正在尝试在滑块更改时进行网络调用,但我不想进行一百万个网络调用,因为在滑动时经常调用该方法。如何将此侦听器回调为Observable?我知道一旦它是一个可观察的我可以使用去抖动,并且只在一定时间间隔后更新。

我尝试过做Observable.create(),但我在回调方法中,我无法弄清楚它是如何工作的。我正在使用Kotlin和RxJava2顺便说一句。

override fun onSliderChanged(percent: Int)
{
    // Either here or in the presenter I want to make this 
    // callback reactive so I can debounce the callback
    presenter.onSliderChanged(percent)
}

1 个答案:

答案 0 :(得分:1)

It is not clear from your question exactly how you pass your listener, but there are two general cases that come to mind. Pick the one matches your implementation.

Case 1: The listener is passed as an interface

For this, I assume you have an interface similar too --

interface SliderChangedListener {
    fun onSliderChanged(percent: Int)
}

and a method in your Slider class that takes an instance of that listener --

fun setSlideListener(listener: SliderChangedListener) 

This is a common Java pattern. In Kotlin, it would be easier to drop the interface and just pass a function variable, but given you showed an override above, seems possible your view is coming from Java. Regardless, the key is to create an observable and have it create and set listener that calls onNext.

Observable.create(Observable.OnSubscribe<Int> {
        subscriber ->
        slider.setSlideListener(object : SliderChangedListener {
            override fun onSliderChanged(percent: Int) {
                subscriber.onNext(percent)
            }
        })
    }).subscribe { /* respond to the slide */ }

Case 2: You extend the Slider class and override the listener

In this case, I assume you have a listener method in your Slider class that you override directly with the code in your question. In this case, we can use a Subject to mediate between the listener and the subscriber.

val mySlider = object : Slider() {
        val sliderObservable: PublishSubject<Int> = PublishSubject.create()
        override fun onSliderChanged(percent: Int) {
            sliderObservable.onNext(percent)
        }
    }
mySlider.sliderObservable.subscribe({ /* do slider work */ })