经常调用回调方法将事件转发给 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 */ })
所以我在自定义滑块视图上有这个侦听器。当用户滑动滑块时,视图调用 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 */ })