日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android 功能防抖,一款简单的消息防抖框架

發(fā)布時(shí)間:2024/10/8 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 功能防抖,一款简单的消息防抖框架 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。