標籤:工作 磁碟 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