android 開源架構Universal-Image-Loader解析

來源:互聯網
上載者:User

標籤:android   universal-image-load   圖片載入   

最近要在公司分享東西,很多項目中用到Universal-Image-Loader這個開源架構,沒有太多的進程調度,沒有各種記憶體讀取控制機制、沒有各種異常處理,一起學習一下

1.UIL原理

a.UI:請求資料,使用唯一的Key值索引Memory Cache中的Bitmap。

b.記憶體緩衝:緩衝搜尋,如果能找到Key值對應的Bitmap,則返回資料。否則執行c。

c.硬碟儲存:使用唯一Key值對應的檔案名稱,檢索SDCard上的檔案。如果有對應檔案,使用BitmapFactory.decode*方法,解碼Bitmap並返回資料,同時將資料寫入緩衝。如果沒有對應檔案,執行d。

d.下載圖片:啟動非同步線程,從資料來源下載資料(Web)。

e.若下載成功,將資料同時寫入硬碟和緩衝,並將Bitmap顯示在UI中。


2.UIL特徵

多線程下載圖片

隨意配置ImageLoader

支援三級緩衝

支援負載檔案系統,assets,drawable等圖片

支援圖片下載過程的監聽

。。。

特徵很多,這裡就不一一列舉了


3.UIL解析

ImageLoaderConfiguration是針對圖片緩衝的全域配置,主要有線程類、緩衝大小、磁碟大小、圖片下載與解析、日誌方面的配置。

ImageLoader是具體下載圖片,緩衝圖片,顯示圖片的具體執行類,它有兩個具體的方法displayImage(...)、loadImage(...),但是其實最終他們的實現都是displayImage(...)

DisplayImageOptions用於指導每一個Imageloader根據網狀圖片的狀態(空白、下載錯誤、正在下載)顯示對應的圖片,是否將緩衝載入到磁碟上,下載完後對圖片進行怎麼樣的處理。


4.ImageLoaderConfiguration配置

  ImageLoaderConfiguration configuration=ImageLoaderConfiguration.createDefault(this);?                                            <span style="font-family: 微軟雅黑, 宋體, Arial;">ImageLoader.getInstance().init(configuration);</span>

使用createDefault()方法建立了一個預設的ImageLoaderConfifuration

1.開啟記憶體緩衝,壓縮的圖片大小為螢幕的寬和高

2.開啟硬碟緩衝,不壓縮圖片

3.預設的線程池為3

4.允許緩衝不同尺寸的圖片

5.預設使用FIFO處理任務

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)        .memoryCacheExtraOptions(480, 800) // default = device screen dimensions        .diskCacheExtraOptions(480, 800, null)        .taskExecutor(...)        .taskExecutorForCachedImages(...)        .threadPoolSize(3) // default        .threadPriority(Thread.NORM_PRIORITY - 1) // default        .tasksProcessingOrder(QueueProcessingType.FIFO) // default        .denyCacheImageMultipleSizesInMemory()        .memoryCache(new LruMemoryCache(2 * 1024 * 1024))        .memoryCacheSize(2 * 1024 * 1024)        .memoryCacheSizePercentage(13) // default        .diskCache(new UnlimitedDiscCache(cacheDir)) // default        .diskCacheSize(50 * 1024 * 1024)
以上對應預設配置,如果預設配置不滿足你的要求,可以自行修改

5.DisplayImageOptions配置(根據需求自行修改)

DisplayImageOptions options = new DisplayImageOptions.Builder()        .showImageOnLoading(R.drawable.ic) // resource or drawable        .showImageForEmptyUri(R.drawable.ic_empty) // resource or drawable        .showImageOnFail(R.drawable.ic_error) // resource or drawable        .resetViewBeforeLoading(false)  // default        .delayBeforeLoading(1000)        .cacheInMemory(false) // default        .cacheOnDisk(false) // default        .preProcessor(...)        .postProcessor(...)        .extraForDownloader(...)        .considerExifParams(false) // default        .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default        .bitmapConfig(Bitmap.Config.ARGB_8888) // default

1.根據網路情況設定圖片狀態(空白,下載錯誤,正在下載)

2.圖片載入完成後是否重設view

3.設定下載延遲時間

4.是否緩衝到記憶體或者硬碟

5.下載完成後對圖片的處理


6.ImageLoader

ImageLoader有兩個具體的方法,loadImage()和displayImage(),在項目中一般直接使用displayImage()方法,比較方便


ImageLoader.getInstance().displayImage(imageUrl, mImageView, options);

7.載入其他來源的圖片

載入其他來源的圖片時,只需要把url改掉

載入content provider圖片String contentprividerUrl = “content://media/external/audio/albumart/13"

載入assets圖片String assetsUrl = Scheme.ASSETS.wrap("image.png");  

載入drawable圖片String drawableUrl = Scheme.DRAWABLE.wrap("R.drawable.image")


8.UIL記憶體緩衝策略

1. 只使用的是強引用緩衝 

LruMemoryCache(這個類就是這個開源架構預設的記憶體緩衝類,緩衝的是bitmap的強引用,下面我會從源碼上面分析這個類)

  2.使用強引用和弱引用相結合的緩衝有

  UsingFreqLimitedMemoryCache(如果緩衝的圖片總量超過限定值,先刪除使用頻率最小的bitmap)

LRULimitedMemoryCache(這個也是使用的lru演算法,和LruMemoryCache不同的是,他緩衝的是bitmap的弱引用)

FIFOLimitedMemoryCache(先進先出的緩衝策略,當超過設定值,先刪除最先加入緩衝的bitmap)

LargestLimitedMemoryCache(當超過緩衝限定值,先刪除最大的bitmap對象)

LimitedAgeMemoryCache(當 bitmap加入緩衝中的時間超過我們設定的值,將其刪除)

  3.只使用弱引用緩衝

  WeakMemoryCache(這個類緩衝bitmap的總大小沒有限制,唯一不足的地方就是不穩定,緩衝的圖片容易被回收掉)


9.UIL硬碟緩衝策略

FileCountLimitedDiscCache(可以設定緩衝圖片的個數,當超過設定值,刪除掉最先加入到硬碟的檔案)LimitedAgeDiscCache(設定檔案存活的最長時間,當超過這個值,就刪除該檔案)

TotalSizeLimitedDiscCache(設定緩衝bitmap的最大值,當超過這個值,刪除最先加入到硬碟的檔案)

UnlimitedDiscCache(這個緩衝類沒有任何的限制)

註:UIL預設記憶體緩衝使用的LruMemoryCache,預設硬碟緩衝使用的是UnlimitedDiscCache


10.UIL如何避免OOM

1.減少線程池的個數,在ImageLoaderConfiguration中的(.threadPoolSize)中配置,預設為3

2.在DisplayImageOptions選項中配置bitmapConfig為Bitmap.Config.RGB_565,因為預設是ARGB_8888, 使用RGB_565會比使用ARGB_8888少消耗2倍的記憶體

3.在ImageLoaderConfiguration中配置圖片的記憶體緩衝為memoryCache(new WeakMemoryCache()) 或者不使用記憶體緩衝

4.在DisplayImageOptions選項中設定.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者imageScaleType(ImageScaleType.EXACTLY)

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

android 開源架構Universal-Image-Loader解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.