ImageAware
需要顯示圖片的對象的接口,可包裝 View 表示某個需要顯示圖片的 View
主要函數:
(1). View getWrappedView()
得到被包裝的 View,圖片在該 View 上顯示。
(2). getWidth() 與 getHeight()
得到寬度高度,在計算圖片縮放比例時會用到。
(3). getId()
得到唯一標識 id。ImageLoaderEngine中用這個 id 標識正在加載圖片的ImageAware和圖片內存緩存 key 的對應關系,圖片請求前會將內存緩存 key 與新的內存緩存 key 進行比較,如果不相等,則之前的圖片請求會被取消。這樣當ImageAware被復用時就不會因異步加載(前面任務未取消)而造成錯亂了。
ViewAware
封裝 Android View 來顯示圖片的抽象類,實現了ImageAware接口,利用Reference來 Warp View 防止內存泄露。
主要函數:
(1). ViewAware(View view, boolean checkActualViewSize)
構造函數。
view表示需要顯示圖片的對象。
checkActualViewSize表示通過getWidth()和getHeight()獲取圖片寬高時返回真實的寬和高,還是LayoutParams的寬高,true 表示返回真實寬和高。
如果為true會導致一個問題,View在還沒有初始化完成時加載圖片,這時它的真實寬高為 0,會取它LayoutParams的寬高,而圖片緩存的 key 與這個寬高有關,所以當View初始化完成再次需要加載該圖片時,getWidth()和getHeight()返回的寬高都已經變化,緩存 key 不一樣,從而導致緩存命中失敗會再次從網絡下載一次圖片。可通過ImageLoaderConfiguration.Builder.denyCacheImageMultipleSizesInMemory()設置不允許內存緩存緩存一張圖片的多個尺寸。
(2). setImageDrawable(Drawable drawable)
如果當前操作在主線程并且 View 沒有被回收,則調用抽象函數setImageDrawableInto(Drawable drawable, View view)去向View設置圖片。
(3). setImageBitmap(Bitmap bitmap)
如果當前操作在主線程并且 View 沒有被回收,則調用抽象函數setImageBitmapInto(Bitmap bitmap, View view)去向View設置圖片。
ImageViewAware
封裝 Android ImageView 來顯示圖片的ImageAware,繼承了ViewAware,利用Reference來 Warp View 防止內存泄露。
如果getWidth()函數小于等于 0,會利用反射獲取mMaxWidth的值作為寬。
如果getHeight()函數小于等于 0,會利用反射獲取mMaxHeight的值作為高。
NonViewAware
僅包含處理圖片相關信息卻沒有需要顯示圖片的 View 的ImageAware,實現了ImageAware接口。常用于加載圖片后調用回調接口而不是顯示的情況。