RxView学习及实现按钮防抖功能
RxView
RxBinding是是一組開源庫,可將Android的中各類UI控件的動作事件轉換為RxJava中的數據流。使用RxBinding,以RxJava觀察者模式來處理UI事件.RxView是RxBinding中的一個組件。
?
引入依賴
注意:RxBinding包中包含RxJava的內容,所以就無需再添加RxJava的依賴了。
dependencies {......compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'}代碼分析
1. RxView.clicks(查看視圖)
? ? ? ? 通過源碼可發現其內部封裝了View.OnClickListener點擊監聽,調用點擊方法返回一個可觀測對象,每當點擊這個查看的時候,該可觀測對象就會發射一個事件,隨即調用onNext()方法,可觀察到對應的觀察者就可以通過onNext()回調響應此次點擊事件使用RxBinding還可做到點擊防抖的效果來看代碼。:
addDisposable(RxView.clicks(btnClick) .throttleFirst(2, TimeUnit.SECONDS).subscribe(o -> { Log.e("rx_binding_test", "clicks:點擊了按鈕:兩秒內防抖");}));? ? ? throttleFirst(long windowDuration,TimeUnit unit),設置一定時間內只響應首次(throttleFirst)或者末次(throttleLast)的點擊事件.windowDuration為防抖時間,unit為時間單位。調用這個方法便可防止短時間內對的重復點擊,本例中設置的防抖時間為2秒。
?
2. RxView.longClicks(查看視圖)?
? ?內部封裝了View.OnLongClickListener長按監聽,原理同上。
addDisposable(RxView.longClicks(btnClick).subscribe(o -> {Log.e("rx_binding_test", "longClicks:長點擊了按鈕");}));?
防抖實現
? ? ? ?在實際開發中,我們經常需要經常遇到一個問題,假設有一個按鈕,這個按鈕是請求網絡,或者彈窗某一個狀態欄,當用戶(特別是光速手)點擊過快的時候,會請求多次網絡,或者顯示兩次狀態欄一方面會導致頻繁的請求,導致網絡資源浪費;另一方面會導致顯示出現問題,可能會被測試提錯誤。
? ? ? 這個時候,我們希望可以有一種按鈕防抖機制,來幫我們解決這類辦法。
tvRfbtn.setOnClickListener(v -> {if (!CommonUtils.isNetWorkAvailable(NewMessageActivity.this)) {DialogNewUtils.getInstance().showDialogToast(NewMessageActivity.this, "網絡出問題了,請檢查網絡");} else {mPageNumber = 1;initData();} });? ? ? ?tvRfbtn是一個TestView,點擊這個控件,在網絡正常的情況下,我們會進行初始化,請求網絡,獲取數據,但是當用戶點擊過快當情況下,很容易請求多次,進行資源浪費,這里我用RxView改寫,代碼如下:
RxView.clicks(tvRfbtn).throttleFirst(MineConstants.WINDOW_DURATION, TimeUnit.SECONDS).subscribe(new Consumer<Object>() {@Overridepublic void accept(Object o) throws Exception {if (!CommonUtils.isNetWorkAvailable(NewMessageActivity.this)) {DialogNewUtils.getInstance().showDialogToast(NewMessageActivity.this, "網絡出問題了,請檢查網絡");} else {mPageNumber = 1;initData();}} });? ? ? ?在這里,我加入了防抖機制,用戶在1秒內點擊只會觸發1次,不會出現1秒內瘋狂點擊3次,請求3次的情況。
總結
以上是生活随笔為你收集整理的RxView学习及实现按钮防抖功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习入门实战——决策树算法实战Tit
- 下一篇: 我的世界启动器+账号+密码