前面已經封裝了很多常用、基礎的組件了: "base module" , 包括了: crash 處理 常用工具類 apk 升級處理 log 組件 logcat 採集 ftp 文件上傳 blur 高斯模糊 fresco 圖片處理 等等 那麼,今天繼續再來封裝一個網路組件,基於 "volley" 的二次封 ...
前面已經封裝了很多常用、基礎的組件了:base-module, 包括了:
- crash 處理
- 常用工具類
- apk 升級處理
- log 組件
- logcat 採集
- ftp 文件上傳
- blur 高斯模糊
- fresco 圖片處理
- 等等
那麼,今天繼續再來封裝一個網路組件,基於 volley 的二次封裝,目的也是為了簡化外部使用,以及新項目可快速接入使用。
這樣一來,開發一個簡單的 app 所需要的公共基礎組件基本都已經封裝好了,在這些組件基礎上,應該可以快速完成第一版迭代,快速出包。
下一次的計劃,也許是封裝 OkHttp 的組件,也許是封裝個播放器的組件,也可能是封裝常用的自定義 View,視情況而定吧。
前言
封裝了這麼多組件,一步步走過來,我已經有了自己一定習慣下的封裝思路了,可能代碼寫得並不是很好,設計得不是很合理,內部職責劃分不是很明確。
但,我熱衷的封裝思想是:一條調用鏈使用。
我喜歡藉助 AndroidStudio 的代碼提示功能,結合調用鏈的使用方式,將組件的使用劃分成多個步驟,控制每個步驟的 api,讓其他人使用的時候,最好可以達到不看文檔,不看源碼,只需要瞭解入口,之後都可以通過 AndroidStudio 的代碼提示來一步步引導使用的目的。
至於為什麼需要二次封裝 Volley,這篇就不扯了,反正每個組件的封裝肯定是來源於有這方面的需求。
二次封裝
同樣,DVolley 組件你需要瞭解的入口也就是:DVolley
第一個步驟我開放了三個 api,其實也就是 DVolley 大概支持的功能:
url()
用於訪問服務端的介面
enterGlobalConfig()
用於配置一些公共的請求參數或請求頭信息,比如 mac,t 這類通常都是公共的請求參數,不必每次都手動去設置。
cancelRequests()
內部支持一次性同時發起六條請求,網路問題等等總會導致某些請求在隊列中等待,但如果這時頁面退出了,那麼這些請求應該就要取消掉,甚至已經發出的請求這時候才回來,那也應該不要通知上層 ui。所以,支持對每條請求設置 tag,然後根據 tag 來取消這些請求。
目前組件只支持三個功能:
post()
post 方式訪問網路介面
get()
get 方式訪問網路介面
asImageFile()
下載網路中的圖片文件到本地指定目錄,因為 volley 的設計並不能夠很好的支持大文件的下載,所以就不提供這個了,剛好有下載圖片文件的需求,所以就封裝上了。
雖然 volley 也支持類似 fresco 這種框架對圖片的緩存,載入處理,但這些工作一般項目里都選擇 fresco 或 glide 來處理了,所以組件也就不提供 volley 的這些功能了。
下麵看看下載圖片文件的用法:
下載圖片文件示例
DVolley.url("https://upload-images.jianshu.io/upload_images/1924341-d7190704b160d280.png")
.asImageFile()
.downloadTo(new File("/mnt/sdcard/my.png"), new VolleyListener<String>() {
@Override
public void onSuccess(String data) {
//data 是圖片文件保存的目錄地址
}
@Override
public void onError(int code, String description) {
}});
通常圖片框架都預設處理圖片下載後的緩存目錄、保存格式、文件名等等。這就導致有時如果需要明確指定下載網路上某張圖片到指定的本地目錄中以指定的文件名存儲,使用這些圖片框架就有些麻煩了,所以就封裝了這個功能。
繼續回來看看正常的網路介面訪問的使用:
post 方法支持的 api 跟 get 一樣,也就是設置下 tag(用於取消該請求),設置下請求參數,請求頭,然後調用 enqueue()
,內部會根據隊列情況自動發起請求,可設置回調,回調接收一個泛型參數,內部會自動根據泛型解析 json 數據後在回調方法中返回實體類數據。
所以,其實,封裝的組件做的事並不多,就是將 Volley 的使用流程式控制制起來,提供調用鏈的使用方式。
使用示例
compile 'com.dasu.net:volley:0.0.1'
//get 方法獲取 wanAndroid 網站的公眾號列表,內部自動進行 json 解析
DVolley.url("http://wanandroid.com/wxarticle/chapters/json")
.get()
.enqueue(new VolleyListener<ArrayList<WanAndroid>>() {
@Override
public void onSuccess(ArrayList<WanAndroid> data) {
Log.w("!!!!!!!", "wan: " + data.size());
for (WanAndroid wan : data) {
Log.e("!!!!!!!!!!", wan.toString());
}
}
@Override
public void onError(int code, String description) {
}});
//post 方法請求,設置參數,請求頭,tag(用於取消請求使用)
DVolley.url("https://easy-mock.com/mock/5b592c01e4e04f38c7a55958/ywb/is/version/checkVersion")
.post()
.tag("VolleyActivity")
.addParam("name", "dasu")
.addHeader("weixin", "dasuAndroidTv")
.enqueue(new VolleyListener<EasyMockReturn>() {
@Override
public void onSuccess(EasyMockReturn data) {
Log.e("!!!!!", "return: " + data);
}
@Override
public void onError(int code, String description) {
}
});
//取消tag為xxx的請求
DVolley.cancelRequests("VolleyActivity");
//下載圖片文件到本地指定的目錄
DVolley.url("https://upload-images.jianshu.io/upload_images/3537898-445477c7ce870988.png")
.asImageFile()
.downloadTo(new File("/mnt/sdcard/abcd.png"), new VolleyListener<String>() {
@Override
public void onSuccess(String data) {
Log.e("!!!!!", "asImageFile: " + data);
}
@Override
public void onError(int code, String description) {
Log.e("!!!!!", "asImageFile: " + description);
}
});
//設置通用的請求參數或請求頭
DVolley.enterGlobalConfig()
.globalParam("t", String.valueOf(System.currentTimeMillis()))
.globalHeader("os", "android");
Github地址
DVolley組件:https://github.com/woshidasusu/base-module/tree/master/volley
組件有如下兩個依賴庫:
compile 'com.android.volley:volley:1.1.1'
compile 'com.google.code.gson:gson:2.7'
支持以下功能:
- get 請求
- post 請求
- 圖片下載在本地指定目錄
- 自動根據泛型解析 json
- 取消指定請求
- 設置通用請求參數或請求頭
大家好,我是 dasu,歡迎關註我的公眾號(dasuAndroidTv),如果你覺得本篇內容有幫助到你,可以轉載但記得要關註,要標明原文哦,謝謝支持~