1. 程式人生 > >Android 圖片載入框架 Volley框架原始碼 以及Picasso和Glide比較

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裡;