Метод обратного вызова часто вызывается для пересылки события в Observable?

Итак, у меня есть этот слушатель в виде настраиваемого слайдера. Представление вызывает 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)
}

person Stampede10343    schedule 02.12.2016    source источник


Ответы (1)


Из вашего вопроса неясно, как именно вы обойдете слушателя, но на ум приходят два общих случая. Выберите тот, который соответствует вашей реализации.

Случай 1. Слушатель передается как интерфейс

Для этого я предполагаю, что у вас тоже есть похожий интерфейс -

interface SliderChangedListener {
    fun onSliderChanged(percent: Int)
}

и метод в вашем Slider классе, который принимает экземпляр этого слушателя -

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 и переопределяете прослушиватель

В этом случае я предполагаю, что у вас есть метод слушателя в вашем классе 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 */ })
person iagreen    schedule 02.12.2016
comment
Это идеально. Случай 1 был тем, что мне было нужно. Я пытался сделать Observable.create {} с логикой там вместо использования Observable.OnSubscribe ‹Int› - person Stampede10343; 02.12.2016