2

だから私はカスタムスライダービューにこのリスナーを持っています。onSliderChanged(int percent)ユーザーがスライダーをスライドすると、ビューが呼び出されます。スライダーが変化したときにネットワーク呼び出しをしようとしていますが、スライド時にメソッドが頻繁に呼び出されるため、ネットワーク呼び出しを100万回行いたくありません。このリスナーのコールバックを 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)
}
4

1 に答える 1

1

あなたの質問からは、リスナーをどのように通過させるかは明確ではありませんが、2 つの一般的なケースが思い浮かびます。実装に一致するものを選択してください。

ケース 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質問のコードで直接オーバーライドするリスナー メソッドがクラスにあると仮定します。この場合、 a を使用し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 */ })
于 2016-12-02T04:51:20.220 に答える