[本文未經(jīng)許可灰羽,不可轉(zhuǎn)載或其他形式的分享 ]
Android 開發(fā)中網(wǎng)絡(luò)請求很多都會用Retrofit,面試過程發(fā)現(xiàn)很多只會用不去了解http基礎(chǔ)原理呢铆,不打牢基礎(chǔ),遇到問題不能很好的解決叨襟,在開發(fā)中經(jīng)常遇到重復(fù)http請求敬扛,也就是一個請求還沒有返回相同的請求又發(fā)出了晰洒,不但會讓客戶端體驗不好還可能導(dǎo)致服務(wù)器壓力過大。
解決方法
- 1.如果只是用戶重復(fù)點擊按鈕導(dǎo)致的也可以簡單的disable 按鈕或者限制高頻點擊
- 2.上面的場景只要退出頁面再進(jìn)入一次就失效了或者業(yè)務(wù)太復(fù)雜就會導(dǎo)致重復(fù)請求
Anyway舔哪,我們就是想要一種方法要全局的攔截HTTP 的請求欢顷,重復(fù)的請求就不要再請求了。
其實以前使用AsyncHttp 的時候全局?jǐn)r截重復(fù)http請求還是很簡單的捉蚤。那么Retrofit 也是一樣的原理抬驴,可能大家不熟悉。
1.首先要確定一個http請求是否是相同的缆巧,根據(jù)請求的方法布持,path和參數(shù)等確定并生成一個KEY
2.使用一個全局的MAP 保存請求的map.add(key),假如Map 中不存在陕悬。否則就是存在要忽略题暖,并返回一個無效的Response。
3.等http請求返回后Map.Remove(key)
下面看看部分代碼
- 添加記錄請求或者忽略
String requestKey = MD5Util.getUpperMD5Str(Request.toString());
if (null == requestIdsMap.get(requestKey)) {
requestIdsMap.put(requestKey, System.currentTimeMillis());
} else {
//自定義的一個錯誤Response ,哈哈哈這個操作很騷
return new Response.Builder()
.xxxx
.yyyy
.build();
}
2.在攔截器里面攔截請求胧卤,并取消map中的http請求標(biāo)記
requestIdsMap.remove(requestKey);
就是這么Easy, Retrofit的設(shè)計實在是巧妙唯绍,添加各種騷操作也是很簡單
Demo:https://github.com/AnyLifeZLB/MVP-Dagger2-Rxjava2
代碼在Demo中需要自己找,搜索關(guān)鍵字requestIdsMap枝誊。From Felix