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

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

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

为此,我假设你有一个类似的界面 –

 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类中有一个监听器方法,可以直接用你的问题中的代码覆盖。 在这种情况下,我们可以使用一个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 */ })