android 功能防抖,一款简单的消息防抖框架
WQthrottle?是一款消息防抖框架,在一定的時(shí)間延時(shí)中做到只觸發(fā)一次結(jié)果的回調(diào)。
使用
使用的話,還是看 github 的 README 吧。
開發(fā)目的
開發(fā)這款框架的初衷是為了解決以下的幾個(gè)痛點(diǎn):
多余的操作請(qǐng)求
多頁面消息傳遞
痛點(diǎn)一(多余的操作請(qǐng)求)
這個(gè)痛點(diǎn)在我們的業(yè)務(wù)中經(jīng)常出現(xiàn),下面列出兩個(gè)比較常見的業(yè)務(wù)操作:
點(diǎn)贊
在我們?cè)O(shè)計(jì)點(diǎn)贊的時(shí)候,每點(diǎn)擊一次 贊?操作都會(huì)請(qǐng)求服務(wù)器,以告知服務(wù)器當(dāng)前是 點(diǎn)贊?操作還是 取消贊?操作,如果用戶這時(shí)頻繁去點(diǎn)贊,就會(huì)導(dǎo)致過多的網(wǎng)絡(luò)請(qǐng)求,產(chǎn)生了不必要的浪費(fèi)。對(duì)于設(shè)計(jì)層面來說,點(diǎn)贊功能無非就是兩種狀態(tài),贊或是沒贊?,我們完全可以等待用戶停止操作后再去請(qǐng)求服務(wù)器。
搜索
實(shí)時(shí)搜索展示搜索內(nèi)容也是我們平時(shí)業(yè)務(wù)中比較常見的功能,我們給 EditText 注冊(cè)?TextWatcher 監(jiān)聽,在?onTextChanged?中實(shí)時(shí)拿到用戶輸入的內(nèi)容然后請(qǐng)求網(wǎng)絡(luò),看似一段沒有任何問題的操作,就敗在不同用戶的輸入習(xí)慣,有的人打字非常慢,打入一些詞組,onTextChanged 收到消息立馬請(qǐng)求服務(wù)器顯示結(jié)果,而有的人打字非常快,而且每打一個(gè)詞組就回車到 EditText 上,這就會(huì)導(dǎo)致頻繁的網(wǎng)絡(luò)請(qǐng)求,更糟糕的情況就是頻繁的頁面渲染,100次請(qǐng)求就會(huì)導(dǎo)致100次的頁面渲染。
痛點(diǎn)二(多頁面消息傳遞)
在剛接觸 Android 開發(fā)時(shí),頁面的消息傳遞一般都是 Intent ,回傳通過 setResult 將結(jié)果帶回上一個(gè)頁面,非常蛋疼的操作,直到后來出現(xiàn) EventBus?,在業(yè)內(nèi)非常流行,一款非常解耦的框架,可以做到在任何地方發(fā)送消息和接收消息,但對(duì)于我來說,缺點(diǎn)還是蠻多的:
Subcribe?太隨意,導(dǎo)致后面項(xiàng)目亂,不好維護(hù)
Eventbus 的內(nèi)部實(shí)現(xiàn)原理是反射,性能問題需要斟酌
每次 post 一個(gè)消息過去都要想,我這個(gè) bean 會(huì)不會(huì)影響到其他的消息接收,算了,還是創(chuàng)建一個(gè) bean 類吧
原理剖析
實(shí)現(xiàn)原理非常簡單, 就一個(gè)核心東西——《Handler》
初始化
初始化操作使用的單例,他會(huì)默認(rèn)構(gòu)造一個(gè) handler 處理類:
handler = HandlerFactory.create(HandlerType.MAIN_THREAD, callBacks);
HandlerType 是一個(gè)枚舉類,該枚舉主要為了告知接收器是在主線程還是子線程,具體可看?HandlerFactory 類。
注冊(cè)
注冊(cè)非常簡單,就是注冊(cè)一個(gè) CallBack 接口,等 post 消息時(shí),會(huì)一一回調(diào)注冊(cè)的 callback
private List callBacks = new ArrayList<>();
public void register(CallBack callBack) {
callBacks.add(callBack);
}
發(fā)送消息
發(fā)送消息整個(gè)框架的核心部分:
WQThrottle.getInstance().delay(int tag, long timeMillis, Object params);
我們來看下 delay 做的什么東西:
public void delay(int tag, long timeMillis, Object params) {
handler.removeMessages(tag);
Message msg = handler.obtainMessage();
msg.obj = params;
msg.what = tag;
handler.sendMessageDelayed(msg, timeMillis);
}
還是非常簡單,就是在 delay 時(shí)間內(nèi),移除之前觸發(fā)的消息,然后重新發(fā)送消息,直到用戶不觸發(fā)了,等 delay 時(shí)間到了,消息就會(huì)發(fā)送出去了。
消息接收
消息的接收需要先看看回調(diào)部分的代碼:
new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
sendMessages(msg, callBacks);
}
};
private static void sendMessages(Message msg, List callBacks) {
for (int i = 0, len = callBacks.size(); i < len; i++) {
callBacks.get(i).throttleResult(msg.what, msg.obj);
}
}
發(fā)送的消息被 Handler 接收到了,會(huì)遍歷所有 CallBack 注冊(cè)接口,將信息 post 出去。
@Override
public void throttleResult(int tag, Object obj) {
switch(tag){//do something}
}
CallBack 根據(jù)發(fā)送的 tag 進(jìn)行比較,確定是什么操作,然后取出參數(shù) obj。
結(jié)束
整個(gè)設(shè)計(jì)非常簡單,僅僅只通過 Handler 就實(shí)現(xiàn)了基于消息的框架。
話不多,就這樣吧
總結(jié)
以上是生活随笔為你收集整理的android 功能防抖,一款简单的消息防抖框架的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机C语言知识点免费下载,全国计算机二
- 下一篇: android ppt下载地址,Micr