1. 程式人生 > >Android 開源框架 ( 九 ) 圖片加載框架---ImageLoader

Android 開源框架 ( 九 ) 圖片加載框架---ImageLoader

count 自動縮放 算法 mit ces nor 針對 eas get

一.引言

  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