Android 開源架構 ( 九 ) 圖片載入架構---ImageLoader

來源:互聯網
上載者:User

標籤:工作   磁碟   href   new   set   str   tip   列排序   reload   

一.引言

  Android的每一個App通常只擁有有限的系統資源,Android裝置為每個App分配的記憶體大小是也是有上限的,並且,針對不同的裝置配置所分配的記憶體大小也是不一樣的,最小為16MB。圖片會佔用大量的記憶體,尤其是那些超清照片。所以圖片載入時做容易造成安卓記憶體溢出的原因,而要解決這些問題還需要很多相關知識:
  1、多線程下載,線程管理。
  2、多級緩衝架構設計和策略,記憶體緩衝,磁碟緩衝,緩衝有效性處理。
  3、圖片壓縮,特效處理,動畫處理。
  4、複雜網路情況下下載圖片策略,例如弱網路等。
  5、記憶體管理,lru 演算法、對象引用、GC回收等最佳化。

  Universal ImageLoader 是很早開源的圖片緩衝,在早期被很多應用使用。

  Universal ImageLoader的GitHub地址:https://github.com/nostra13/Android-Universal-Image-Loader
  最近一次更新是在3年前,已經停止更新了。不推薦新項目中使用。

二.基本使用   1. 添加依賴
compile ‘com.nostra13.universalimageloader:universal-image-loader:1.9.5‘
  2.Application初始化
    // 初始化參數        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)                .threadPriority(Thread.NORM_PRIORITY - 2)               // 線程優先順序                .denyCacheImageMultipleSizesInMemory()                  // 當同一個Uri擷取不同大小的圖片,緩衝到記憶體時,只緩衝一個。預設會緩衝多個不同的大小的相同圖片                .discCacheFileNameGenerator(new Md5FileNameGenerator()) // 將儲存的時候的URI名稱用MD5                .tasksProcessingOrder(QueueProcessingType.LIFO)         // 設定圖片下載和顯示的工作隊列排序                .writeDebugLogs()                                       // 列印debug log                .build();        // 全域初始化此配置        ImageLoader.getInstance().init(config);
  3.基本使用
imageLoader.displayImage(Constants.IMAGES[position],holder.iv,options);private DisplayImageOptions options = new DisplayImageOptions.Builder()            .showStubImage(R.drawable.atguigu_logo)          // 設定圖片下載期間顯示的圖片            .showImageForEmptyUri(R.drawable.atguigu_logo)  // 設定圖片Uri為空白或是錯誤的時候顯示的圖片            .showImageOnFail(R.drawable.atguigu_logo)       // 設定圖片載入或解碼過程中發生錯誤顯示的圖片            .cacheInMemory(true)                        // 設定下載的圖片是否緩衝在記憶體中            .cacheOnDisk(true)                          // 設定下載的圖片是否緩衝在SD卡中            .displayer(new RoundedBitmapDisplayer(20))  // 設定成圓角圖片            .build();                                   // 建立配置過得DisplayImageOption對象;        
三.拓展瞭解

  ImageLoaderConfiguration是針對圖片緩衝的全域配置,主要有線程類、緩衝大小、磁碟大小、圖片下載與解析、日誌方面的配置。
  ImageLoader是具體下載圖片,緩衝圖片,顯示圖片的具體執行類,它有兩個具體的方法displayImage(...)、loadImage(...),但是其實最終他們的實現都是displayImage(...)。
  DisplayImageOptions用於指導每一個Imageloader根據網狀圖片的狀態(空白、下載錯誤、正在下載)顯示對應的圖片,是否將緩衝載入到磁碟上,下載完後對圖片進行怎麼樣的處理。

  1.ImageLoaderConfiguration的配置主要是全域性的配置,主要有線程類、緩衝大小、磁碟大小、圖片下載與解析、日誌方面的配置。
private static ImageLoaderConfiguration config;    config = new ImageLoaderConfiguration.Builder(context)// 開始構建 ,圖片載入配置            .threadPriority(Thread.NORM_PRIORITY - 2)// 設定線程優先順序            .threadPoolSize(3)// 線程池內載入的數量 ;減少配置之中線程池的大小,(.threadPoolSize).推薦1-5;            .denyCacheImageMultipleSizesInMemory()// 設定載入的圖片有多樣的            .tasksProcessingOrder(QueueProcessingType.LIFO)// 圖片載入任務順序            .memoryCache(new WeakMemoryCache())//使用.memoryCache(new WeakMemoryCache()),不要使用.cacheInMemory();            .memoryCacheExtraOptions(480, 800) // 即儲存的每個快取檔案的最大長寬            .memoryCacheSizePercentage(60)// 圖片記憶體占應用的60%;             .diskCacheFileNameGenerator(new HashCodeFileNameGenerator())//使用HASHCODE對UIL進行加密命名            .diskCacheFileNameGenerator(new Md5FileNameGenerator())// 將儲存的時候的URI名稱用MD5 加密            .diskCacheSize(50 * 1024 * 1024) // 緩衝設定大小為50 Mb            .diskCache(new UnlimitedDiskCache(cacheDir))// 自訂緩衝路徑            .diskCacheFileCount(100) // 緩衝的檔案數量            .denyCacheImageMultipleSizesInMemory()// 自動縮放            .imageDownloader(new BaseImageDownloader(context, 5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)逾時時間            .memoryCacheExtraOptions(480, 800)//設定緩衝圖片時候的寬高最大值,預設為螢幕寬高;儲存的每個快取檔案的最大長寬            .defaultDisplayImageOptions(options)// 如果需要開啟緩衝機制,需要自己builde一個option,可以是DisplayImageOptions.createSimple()            .writeDebugLogs() // Remove for release app            .build();構建完成(參數可以不用設定全,根據需要來配置)        
  2.每一個ImageLoader.displayImage(...)都可以使用Display Options。
    private DisplayImageOptions options;    options = new DisplayImageOptions.Builder()// 開始構建, 顯示的圖片的各種格式                .resetViewBeforeLoading(true)// 設定圖片在下載前是否重設,複位                .cacheInMemory(true)// 開啟記憶體緩衝                .cacheOnDisk(true) // 開啟硬碟緩衝                 .displayer(new RoundedBitmapDisplayer(20))// 是否設定為圓角,弧度為多少;避免使用RoundedBitmapDisplayer.他會建立新的ARGB_8888格式的Bitmap對象;                .displayer(new FadeInBitmapDisplayer(100))// 是否圖片載入好後漸入的動畫時間                .displayer(new SimpleBitmapDisplayer())// 正常顯示一張圖片                 .bitmapConfig(Bitmap.Config.RGB_565)// 設定圖片的解碼類型;使用.bitmapConfig(Bitmap.config.RGB_565)代替ARGB_8888;                .considerExifParams(true)// 是否考慮JPEG映像EXIF參數(旋轉,翻轉)                .imageScaleType(ImageScaleType.EXACTLY)// 縮放層級                .imageScaleType(ImageScaleType.IN_SAMPLE_INT)//這兩種配置縮放都推薦                .build();// 構建完成(參數可以不用設定全,根據需要來配置)    ImageLoader.getInstance().init(config);//初始化完成
  3.ImageLoader是顯示圖片的具體執行類,它有兩個具體的方法displayImage loadImage(...)
ImageLoader.getInstance().displayImage(url, imageView, options);    

 

 

Android 開源架構 ( 九 ) 圖片載入架構---ImageLoader

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.