本文以glide的3.7.0版本分析。
主要講的就是當我們加載圖片時,使用glide的時候,一般代碼如下:
Glide.with(this).load(url).into(ImageView);
這篇文章主要講的就是with、load、into這三個方法。
with方法
首先,with方法可以傳入的參數有很多,比如context,application,activity,fragment都是可以的。with方法主要是去獲取一個RequestManangerRetriever的一個實例。然后去調用RequestManangerRetriever的get方法。這個get方法雖然有很多重載方法,但是主要是區分傳入的是application類型的參數或者不是application類型的參數。當傳入的是application的參數的 時候,那么就調用帶有context類型參數的get方法,這個很容易理解。因為application的生命周期就是應用的生命周期。這樣就說明glide加載圖片時的生命周期和整個應用的生命周期是一致的。當傳入的不是application類型的參數的 時候呢?glide就會向當前activity添加一個隱式的fragment。具體原因也很簡單,glide加載圖片的時候需要獲取activity的生命周期啊。比如說glide準備加載一個圖片,可此時activity如果被關閉了,那么glide也就沒有必要去加載圖片了。而填入的fragment的生命周期呢,必然是和這個activity的生命周期是同步的。當glide監聽到activity被關閉后,就可以停止加載圖片了。load方法
由于with返回的是一個RequestManangerRetriever對象,那么查找源碼的時候load方法必然是在RequestManangerRetriever類中的。很容易可以想到的是,load是有很多重載方法的。畢竟load里的參數可以是url或者本地文件路徑等多種形式。那么主要的邏輯在源碼中也是大同小異的。當我們把路徑字符串傳進去后,glide會調用loadGeneric這個方法,然后loadGeneric再去調用buildStreamModelLoader方法去加載圖片,buildStreamModelLoader這個方法代碼太復雜了,這里不多說,只要知道是用來加載圖片的就好。最后loadGeneric返回的是一個DrawableTypeRequest對象,這個DrawableTypeRequest類中提供了asBitmap和asGif兩個方法。那么說回DrawableTypeRequest類,這個類本身是沒有load方法的,那么它又如何去加載圖片呢,那么我們去查看它的父類,果然它的父類DrawableRequestBuilder中是含有load方法的。然后我們其實可以在這里發現很多方法,就是我們常用的placeholder、diskCacheStrategy、error方法都是寫在這個類的。有點復雜不過看源碼就很好理解。into方法
看load方法說起來復雜,但是邏輯還是很簡單的,真正復雜的其實是into方法。
into方法在DrawableRequestBuilder類中,不過具體的邏輯實現其實是在DrawableRequestBuilder的父類GenericRequestBuilder中,在這個類的into方法中,它返回的是glide.buildImageViewTarget()方法。這個方法會創建一個Target對象。而這個Target對象就是用來展示圖片的。
//todo target的具體邏輯