前言
本來公司項目的網絡請求框架是基于volley框架的,由于前陣子項目功能擴展和服務端接口跟新變動,導致volley已經不能滿足需求,所以考慮自己封裝網絡庫,緩存部分直接拷貝的volley緩存模塊的源碼(這也得益于volley的高擴展性)。自己封裝庫更加符合需求,也學到了很多東西,再次記錄下。
心得
也分享一點看源碼的心得吧,總結下來幾點:
- 熟悉基本的API調用:作用是熟悉幾個核心的類,類之間的依賴關系,弄清楚幾個類的職責、主要的屬性、方法。
- 隨著API調用的順序,走通源碼的主線的調用流程
- 畫出流程圖、模型圖
- 畫出類圖,總結出類的職責
- 各個模塊的深入理解,理解作者的設計思想
Volley的優點
- 面向接口編程,高擴展性。
- 回調在主線程,不需要進行線程切換
- 支持請求優先級、請求的取消
- 通過使用標準的HTTP緩存機制保持磁盤和內存響應的一致
缺點
- volley不適合上傳下載大量文件,volley的request和response都是把數據放到byte數組里,不支持輸入輸出流
- 特別適合數據量小,通信頻繁的網絡操作。
- 不支持https請求,但是可自行擴展。
- 不支持401錯誤碼。只考慮了statusCode(statusCode < 200 || statusCode > 299的情況
這些優缺點會在具體源碼分析的時候分析。
1、 Volley的使用
mQueue = Volley.newRequestQueue(this);
StringRequest request = new StringRequest(Request.Method.GET, mBaseUrl, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.e("StringGet()", "response = " + response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
mQueue.add(request);
這是一個用volley實現一個最基本網絡請求需要這幾步:1、創建一個請求列隊 2、創建一個Request對象,包裝具體的請求數據、回調等信息。3、將Request加入請求列隊。在這里我們好像只是看到了將請求加入了隊列并沒有去提交相應的任務,這個就是volley的任務調度器的作用,這個稍后說。
2、volley的類圖:
(圖片出自 coodkk 自己也畫了個,沒畫好,直接用了)
1.png
3、volley的模塊
image.png
volley總的來說可以分為上圖幾個模塊
- NetWork:用來具體的http請求,高度擴展,可以擴展HttpUrlConnecion、HttpClient、Okhttp
- 緩存Catch:按照HTTP緩存機制緩存到磁盤,有過期和新鮮度的檢查
- 調用器:有兩類調度器,一種是緩存調度器,從緩存列隊中不斷去取請求,如果有緩存,直接交給分發器處理,如果沒有,將請求丟到NetWork請求列隊,進行網絡請求
- 分發器:實現網絡請求完后的線程切換,將回調結果切換到主線程,方便更新UI
Volley的功能點
- 不同的Request返回不同的數據,從服務器拉取數據后,數據解析的工作交給具體的Request處理,每個Request的子類都自己的解析方式,自己也可以進行擴展
- 重試策略
- 取消請求
- 請求優先級
- 異常的處理
- 地址重定向處理
- 緩存
具體細節放在源碼分析中