【问题标题】:Callback method called often to forward event to Observable?经常调用回调方法将事件转发到 Observable?
【发布时间】:2016-12-02 01:22:38
【问题描述】:

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

【问题讨论】:

    标签: android rx-java kotlin rx-java2


    【解决方案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 */ })
    

    【讨论】:

    • 太完美了。案例1是我需要的。我试图用那里的逻辑来做 Observable.create { } 而不是使用 Observable.OnSubscribe
    猜你喜欢
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 2015-10-29
    相关资源
    最近更新 更多