Android 開源框架 ( 九 ) 圖片加載框架---ImageLoader
一.引言
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