ImageAware
需要顯示圖片的對(duì)象的接口日矫,可包裝 View 表示某個(gè)需要顯示圖片的 View
主要函數(shù):
(1). View getWrappedView()
得到被包裝的 View,圖片在該 View 上顯示账锹。
(2). getWidth() 與 getHeight()
得到寬度高度朵逝,在計(jì)算圖片縮放比例時(shí)會(huì)用到蔚袍。
(3). getId()
得到唯一標(biāo)識(shí) id。ImageLoaderEngine中用這個(gè) id 標(biāo)識(shí)正在加載圖片的ImageAware和圖片內(nèi)存緩存 key 的對(duì)應(yīng)關(guān)系配名,圖片請(qǐng)求前會(huì)將內(nèi)存緩存 key 與新的內(nèi)存緩存 key 進(jìn)行比較啤咽,如果不相等,則之前的圖片請(qǐng)求會(huì)被取消渠脉。這樣當(dāng)ImageAware被復(fù)用時(shí)就不會(huì)因異步加載(前面任務(wù)未取消)而造成錯(cuò)亂了宇整。
ViewAware
封裝 Android View 來(lái)顯示圖片的抽象類,實(shí)現(xiàn)了ImageAware接口芋膘,利用Reference來(lái) Warp View 防止內(nèi)存泄露鳞青。
主要函數(shù):
(1). ViewAware(View view, boolean checkActualViewSize)
構(gòu)造函數(shù)。
view表示需要顯示圖片的對(duì)象为朋。
checkActualViewSize表示通過(guò)getWidth()和getHeight()獲取圖片寬高時(shí)返回真實(shí)的寬和高臂拓,還是LayoutParams的寬高,true 表示返回真實(shí)寬和高习寸。
如果為true會(huì)導(dǎo)致一個(gè)問(wèn)題胶惰,View在還沒(méi)有初始化完成時(shí)加載圖片,這時(shí)它的真實(shí)寬高為 0融涣,會(huì)取它LayoutParams的寬高童番,而圖片緩存的 key 與這個(gè)寬高有關(guān),所以當(dāng)View初始化完成再次需要加載該圖片時(shí)威鹿,getWidth()和getHeight()返回的寬高都已經(jīng)變化剃斧,緩存 key 不一樣,從而導(dǎo)致緩存命中失敗會(huì)再次從網(wǎng)絡(luò)下載一次圖片忽你∮锥可通過(guò)ImageLoaderConfiguration.Builder.denyCacheImageMultipleSizesInMemory()設(shè)置不允許內(nèi)存緩存緩存一張圖片的多個(gè)尺寸。
(2). setImageDrawable(Drawable drawable)
如果當(dāng)前操作在主線程并且 View 沒(méi)有被回收科雳,則調(diào)用抽象函數(shù)setImageDrawableInto(Drawable drawable, View view)去向View設(shè)置圖片根蟹。
(3). setImageBitmap(Bitmap bitmap)
如果當(dāng)前操作在主線程并且 View 沒(méi)有被回收,則調(diào)用抽象函數(shù)setImageBitmapInto(Bitmap bitmap, View view)去向View設(shè)置圖片糟秘。
ImageViewAware
封裝 Android ImageView 來(lái)顯示圖片的ImageAware简逮,繼承了ViewAware,利用Reference來(lái) Warp View 防止內(nèi)存泄露尿赚。
如果getWidth()函數(shù)小于等于 0散庶,會(huì)利用反射獲取mMaxWidth的值作為寬蕉堰。
如果getHeight()函數(shù)小于等于 0,會(huì)利用反射獲取mMaxHeight的值作為高悲龟。
NonViewAware
僅包含處理圖片相關(guān)信息卻沒(méi)有需要顯示圖片的 View 的ImageAware屋讶,實(shí)現(xiàn)了ImageAware接口。常用于加載圖片后調(diào)用回調(diào)接口而不是顯示的情況须教。