Android 圖片載入框架 Volley框架原始碼 以及Picasso和Glide比較
首先了解一下,它是封裝了HTTPConnection和HTTPClient類的一個框架,
適用於資料量少但是通訊頻繁的情況,如載入圖片;
就拿StringRequest(用來請求字串的)舉例:
Volley的順序是 : Http請求-------再接受響應 只需三步
GET:
1.首先新建一個請求佇列,用來存放一會要發出的Http訊息:
2.構造一條HTTP請求:
3.佇列將請求傳送出去:
POST:
和GET一樣,也只需三步;不同的是在第二步寫HTTP請求;
Volley原理:
一開始建立Requestqueue就是呼叫的下面這個方法:
看看newRequestQueue的程式碼:
看看start函式是要開始幹什麼?
Volley設定圖片有三種方式:
ImageRequest;
ImageLoader;(重點分析原始碼)
NewworkImageView;
ImageRequest沒有采用快取,所以不展開說;
使用方法:
RequestQueue原始碼已經講過:
接下來就是建立一個ImageLoader物件:傳入兩個引數,一個就是RequestQueue物件,另一個就是實現ImageCache介面的實現類的物件;
ImageCache介面中定義了兩個方法:存入putBitmap和讀取getBitmap的方法,然後自己去實現就行;
接著就是呼叫ImageLoader的靜態方法getImageListener來獲取ImageListener物件,這個ImageListener是個介面,有一個定義在網路正常情況下的邏輯方法,這個介面還繼承了ErrorListener介面,這個介面有個網路錯誤情況下的邏輯;通過定義一個靜態方法來宣告一個匿名內部類{在其中重寫成功和失敗的邏輯}:
有了這個ImageListener物件之後,就呼叫ImageLoader物件的get方法發出請求,將url和ImageListener物件傳入,
這個get方法其實呼叫的是ImageContainer類的get,並返回一個四個引數Imagecontainer的get方法:
然後ImageContainer類的get方法解釋如上,重要的是呼叫了ImageContainer的構造方法),
這個快取key封裝了圖片URL請求,最大寬度和最大高度;然後通過之前的ImageCache類的getBitmap(快取key)方法獲取一級快取,通過這個一級快取得到bitmap物件,bitmap物件不為空的話,就呼叫ImageListener物件的onResponse方法並顯示快取中的圖片;
請求圖片的介面,可以看到,他通過圖片路徑+高度+寬度生成了一個快取的Key.然後會通過這個Key去mCache中查詢是否有快取圖片.如果有的話,會直接直接把圖片包裝成一個ImageContainer.且直接返回,如果沒有找找到的話.會生成一個一個請求,將這條請求入隊.
如果這個一級快取為空,就通過構造一個ImageContainer物件,直接返回;也是同樣呼叫ImageListener的onResponse方法,顯示預設圖片
通過BatchedImageRequest類來確保Container每個imageContainer物件不重複
那如果沒有快取key或者對應的一級快取,那就只能去ImageRequest來請求,通過BatchedImageRequest來將容器中的ImageContainer物件全部給到request;
最後在RequestQueue中將請求新增進去;
那我們看下這個ImageContainer類如何構造的:
這個ImageContainer類就是對圖片資料請求的資料進行封裝:構造方法中四個資料引數:圖片資源,請求地址,cachekey(就是get方法中的快取key,包含了請求地址,最大高限制,寬限制三個引數)和imageListener,還有一個取消請求的方法,這個方法判斷cachekey是否為空,不為空的話就說明有快取,就返回true取消request,相反就返回false,繼續request;
然後看看BatchedImageRequest類實現:
含有ImageContainer物件的集合MContainers每次新增ImageContainer物件,都先進行判斷有沒有已存在的ImageContainer物件,再新增進去;
這個類是對網路請求進行封裝的類,和ImageContainer類不同的是,ImageContainer如果有三個圖片地址url,會初始化三個ImageContainer物件,但是BatchedImagerequest類只會初始化一個,類中會進行判斷,判斷是否有重複的ImageContainer物件在Container裡;