Android 经常调用回调方法将事件转发给可观察对象?

Android 经常调用回调方法将事件转发给可观察对象?,android,rx-java,kotlin,rx-java2,Android,Rx Java,Kotlin,Rx Java2,因此,我有一个自定义滑块视图上的侦听器。当用户滑动滑块时,视图将调用onSliderChanged(int percent)。我试图在滑块更改时进行网络调用,但我不想进行一百万次网络调用,因为滑动时经常调用该方法。如何将此侦听器回调转换为可观察的?我知道一旦它是一个可观察的,我可以使用去盎司,只有在一定的时间间隔后更新 我尝试过使用Observable.create(),但我使用的是回调方法,我不知道该如何工作。我正在使用Kotlin和RxJava2 btw override fun onSli

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

我尝试过使用
Observable.create()
,但我使用的是回调方法,我不知道该如何工作。我正在使用Kotlin和RxJava2 btw

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:侦听器作为接口传递

为此,我假设您也有一个类似的接口--

以及
Slider
类中的一个方法,该方法获取该侦听器的一个实例--

这是一种常见的Java模式。在Kotlin中,删除接口并只传递函数变量会更容易,但是如果您在上面显示了一个
覆盖
,那么您的观点可能来自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 */ }

太好了。案例1正是我所需要的。我试图用那里的逻辑来做Observable.create{},而不是使用Observable.OnSubscribe
fun setSlideListener(listener: SliderChangedListener) 
Observable.create(Observable.OnSubscribe<Int> {
        subscriber ->
        slider.setSlideListener(object : SliderChangedListener {
            override fun onSliderChanged(percent: Int) {
                subscriber.onNext(percent)
            }
        })
    }).subscribe { /* respond to the slide */ }
val mySlider = object : Slider() {
        val sliderObservable: PublishSubject<Int> = PublishSubject.create()
        override fun onSliderChanged(percent: Int) {
            sliderObservable.onNext(percent)
        }
    }
mySlider.sliderObservable.subscribe({ /* do slider work */ })