2

所以我在自定义滑块视图上有这个监听器。onSliderChanged(int percent)当用户滑动滑块时视图调用。我正在尝试在滑块更改时进行网络调用,但我不想进行一百万次网络调用,因为该方法在滑动时经常被调用。我怎样才能把这个监听器回调变成一个 Observable?我知道一旦它是可观察的,我就可以使用 debounce 并且仅在特定时间间隔后更新。

我试过做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)
}
4

1 回答 1

1

从你的问题中不清楚你是如何通过你的听众的,但我想到了两种一般情况。选择一个与您的实施相匹配的。

案例1:监听器作为接口传递

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

interface SliderChangedListener {
    fun onSliderChanged(percent: Int)
}

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

fun setSlideListener(listener: SliderChangedListener) 

这是一种常见的 Java 模式。在 Kotlin 中,删除接口并只传递一个函数变量会更容易,但鉴于您在override上面显示,您的视图似乎可能来自 Java。无论如何,关键是创建一个 observable 并让它创建和设置调用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类并覆盖侦听器

在这种情况下,我假设您的Slider类中有一个侦听器方法,您可以使用问题中的代码直接覆盖该方法。在这种情况下,我们可以使用 aSubject在侦听器和订阅者之间进行调解。

val mySlider = object : Slider() {
        val sliderObservable: PublishSubject<Int> = PublishSubject.create()
        override fun onSliderChanged(percent: Int) {
            sliderObservable.onNext(percent)
        }
    }
mySlider.sliderObservable.subscribe({ /* do slider work */ })
于 2016-12-02T04:51:20.220 回答