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

Callback method called often to forward event to Observable?

所以我在自定义滑块视图上有这个侦听器。当用户滑动滑块时,视图调用 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)
}

从你的问题中不清楚你是如何通过你的听众的,但有两种常见的情况浮现在脑海中。选择一个与您的实施相匹配的。

情况一:监听器作为接口传递

为此,我假设您也有类似的界面 --

interface SliderChangedListener {
    fun onSliderChanged(percent: Int)
}

以及您的 Slider class 中的一个方法,该方法采用该侦听器的实例 --

fun setSlideListener(listener: SliderChangedListener) 

这是一个常见的 Java 模式。在 Kotlin 中,删除接口并只传递一个函数变量会更容易,但鉴于您在上面显示了 override,您的视图似乎可能来自 Java。无论如何,关键是创建一个可观察对象并让它创建并设置调用 onNext.

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

情况 2:您扩展 Slider class 并覆盖侦听器

在这种情况下,我假设您在 Slider class 中有一个侦听器方法,您可以直接用问题中的代码覆盖它。在这种情况下,我们可以使用一个Subject来调解监听者和订阅者。

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