Android開發——RXBinding防抖機制與案件分析
theme: channing-cyan
概述
在日常開發工作中,會碰到Button按鈕點選處理使用者的需求,比如提交一個訂單到伺服器或跳轉進行支付按鈕操作,如果出現延遲情況造成介面短時間沒響應,使用者接下來就很有可能再去點選一次按鈕去提交,這樣就的話會造成上一個事件還未處理完又多了一個新的事件需要處理,就會出現提交兩次訂單到後臺伺服器或支付兩次。為了防止使用者抖動多次點選造成的問題,就要從點選事件本身去尋找解決辦法。
事件分析
為了避免例如使用者對按鈕多次點選,造成多次網路請求的現象。我們需要對按鈕做防抖處理,即在指定時間內只響應一次點選事件。例如在簡訊驗證登入時,多次點選就會發送多條簡訊,很影響體驗,並且容易填錯驗證碼。
這裡選擇使用的是RxBinding庫,更簡潔更容易理解,更適合我這樣的新手。
首先我們需要匯入依賴:
compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
activity中的實現程式碼:
RxView.clicks(button1)
.throttleFirst(3000,TimeUnit.MILLISECONDS)
subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
Log.i("RxView","點選了button1");
}
});
xml中的程式碼只有一個Button控制元件:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕1"
android:id="@+id/button1"/>
可以看到,無論我們怎麼點選,都只會響應3秒內的第一次點選事件。
這裡只展示了單個按鈕,也可使用ButterKnife實現多個按鈕防抖,相對簡單這裡就不展示了。
RXBinding防抖案件分析
一個普通的按鈕點選後跳轉到另一個頁面的程式碼片段,如下:
//按鈕點選事件:Button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //比如 跳轉到另一個Activity } });
分析:
正常情況下會跳轉到另一頁面,如果碰到手機比較卡的情況,或者使用者手抖瞬間點選兩次,就會造成點選事件被呼叫兩次,頁面跳轉了2次。作為程式設計師首先會想到的就是在點選之後把Button設定為不可點選或不可用 :“clickable=false | | Enable=false”;但是,類似這樣的button一個專案不知道有多少個,每個都要進行判斷是否是Button是否可用,就會比較麻煩、程式碼也顯得冗餘。有麼有更好滴解決辦法呢?
解決方案一
利用規定響應時間,限制連續點選事件重複。
private long lastClickTime = 0;//1、上次點選的時間 @Override public void onClick(View v) { //2、判斷距離上次點選小於2秒 if (System.currentTimeMillis() - lastClickTime <= 2000) { //3、記錄這次點選時間 lastClickTime = System.currentTimeMillis(); } }}其實這個解決方案就是判斷了一下時間差,容易理解。但問題是,每次都要寫(複製)一堆程式碼,顯得程式碼冗餘,重用性不高,如果能夠封裝成工具類的方法,在每次點選事件發生之前呼叫一下就可以自行內部判斷,這樣就更好了嘛!
方案二
隨著Rxjava事件流處理、響應式開發的觀察者模式興起,那麼對於Android控制元件事件監聽也有了變化,通過 RxBinding 把點選的事件監聽轉換成 Observable 之後,就有了對它進行擴充套件的可能。
RxBinding的使用案例詳解博文
RxBinding的使用和原始碼解析博文
這樣可以使用RxBinding實現Button防抖問題處理。程式碼如下:(前後表示1.0\2.0版本用法有別)
button = (Button) findViewById( R.id.bt ) ;
RxView.clicks( button )
.throttleFirst( 2 , TimeUnit.SECONDS ) //兩秒鐘之內只取一個點選事件,防抖操作
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
Toast.makeText(MainActivity.this, "點選了", Toast.LENGTH_SHORT).show();
}
}) ;
RxView.clicks(button)
.throttleFirst( 2 , TimeUnit.SECONDS ) //兩秒鐘之內只取一個點選事件,防抖操作
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
Toast.makeText(MainActivity.this, "點選了", Toast.LENGTH_SHORT).show();
}
});
以上是對Android開發中的RXBinding防抖學習,以及實戰的方案分析與解決。更多Android進階技術前往傳送直達↓↓↓ :link.juejin.cn/?target=htt…點選直達參考學習更多的Android核心技術。
總結一下
- 響應式:就是有人發起,就有人響應,例如廣播,傳送請求後,廣播攔截請求後就會做出相應。
- 事件流:一環一環先後順序發生的事件。
- Rxjava的優點:使程式碼實現的結構看起來更清晰有條理章法。
- 觀察者模式:就是教室裡,老師是被觀察者,學生就是觀察者。老師說舉手,學生受到指令就會做出響應。
- Android效能優化——記憶體洩漏的根本原因
- Android ViewStub的使用方法——邊走邊看邊學
- Android進階——sdk開發和apk開發有什麼區別?
- Android開發——RXBinding防抖機制與案件分析
- Android效能啟動優化——IO優化進階
- Android適配【入坑指南 解決痛點】
- android 開發——疑難雜症ANR簡單介紹與解析
- Android外掛化框架—— Atlas
- 一名合格的音影片工程師,技能樹狀分佈是怎樣形成的?
- Android核心技術—核心(Linux) 的IO棧
- Android前沿技術—— Jetpack Compose
- Android開發資料結構與演算法——ArrayList原始碼講解
- Flutter中如何構建顯式動畫 【教學】
- Android記憶體抖動(主要原因分析 6個優化小技巧)
- Android車載多媒體開發——MediaSession框架
- 車機空調系統開發(HVAC),溫暖一整個冬天!
- 大廠為什麼在招聘安卓架構師時,為啥都需要熟悉 framework 經驗?
- 一個擴充套件性極強的 Flutter MVVM 實用框架,完善你的技術棧
- 2021年,跨端是否已成趨勢?Android 開發還有必要學 Flutter 嗎?
- Jetpack的MVVM通訊 - LiveData的原理分析