2016-12-02 58 views
2

所以我有一個自定義的滑塊鑑於這種監聽。該視圖在用戶滑動滑塊時調用onSliderChanged(int percent)。我試圖在滑塊更改時進行網絡調用,但我不想進行百萬次網絡調用,因爲該方法在滑動時經常被調用。我該如何將此偵聽器回調變成Observable?我知道一旦它可以被觀察到,我可以使用去抖動,並且在一定的時間間隔後纔會更新。經常調用將事件轉發給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

從你的問題中,你不清楚你是如何傳遞你的聽衆,但有兩個一般情況想到。選擇一個符合您的實施。

案例1:監聽器爲接口

對於這段時間裏,我假設你有過類似的界面 -

interface SliderChangedListener { 
    fun onSliderChanged(percent: Int) 
} 

,並在你的Slider類,它的方法該聆聽者的實例 -

fun setSlideListener(listener: SliderChangedListener) 

這是一種常見的Java模式。在科特林,它會更容易放棄的界面,只是傳遞一個函數變量,但給你顯示出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 */ }) 
+0

這是完美的。案例1是我需要的。我試圖做Observable.create {}與邏輯存在,而不是使用Observable.OnSubscribe Stampede10343

相關問題