Android-Universal-Image-Loader最新框架解析

Android-Universal-Image-Loader(對應版本號1.9.4為最新版)
原文作者:顧學武
編輯整理:快碼眾包

目錄
1.個性的ImageLoader配置
1.1.在哪兒配置以及如何配置
2.各式緩存方式任你選擇
2.1.DiskCache 磁盤緩存
2.2.MemoryCache內存緩存
2.3.不要忘記緩存的清理
3.網絡圖片獲取想停就停

  1. 圖像大小由你控制
  2. 注意事項
    6.下載地址 </p>

    1.個性的ImageLoader配置

    1.1.在哪兒配置以及如何配置

    一般會在自己的Application子類的onCreate()方法中對ImageLoader進行配置

    (1) ImageLoaderConfiguration各屬性解釋

    l 偷懶點可以直接使用缺省的配置ImageLoaderConfiguration:

    ImageLoaderConfiguration configuration = ImageLoaderConfiguration.createDefault(this);

    l 也可以自定義ImageLoaderConfiguration:

    ImageLoaderConfiguration類Field詳解:

    Filed名稱 Filed意義 缺省默認值 Builder中設置方法
    Int maxImageWidthForMemoryCacheInt maxImageHeightForMemoryCache 內存緩存圖片的最大寬高 屏幕的寬高度 memoryCacheExtraOptions(…)
    Int maxImageWidthForDiskCacheInt maxImageHeightForDiskCache 磁盤緩存圖片的最大寬高 0,0 discCacheExtraOptions(…)或者diskCacheExtraOptions(…)
    BitmapProcessor processorForDiskCache 圖片處理器,負責從磁盤緩存讀取或寫入前對圖片進行處理 null discCacheExtraOptions(…)或者diskCacheExtraOptions(…)
    Executor taskExecutor 緩存線程池 DefaultConfigurationFactory.createExecutor(…); taskExecutor(…)
    Executor taskExecutorForCachedImages 下載緩存圖片的線程池 DefaultConfigurationFactory.createExecutor(…); taskExecutorForCachedImages(…)
    Boolean customExecutor 是否自定義線程池 false
    Boolean customExecutorForCachedImages 是否自定義下載緩存圖片的線程池 false
    Int threadPoolSize 線程池數 3 threadPoolSize(…)
    Int threadPriority 線程優先級 Thread.NORM_PRIORITY – 2 threadPriority(…)
    QueueProcessingType tasksProcessingType 片下載和顯示的工作隊列排序 QueueProcessingType.FIFO tasksProcessingOrder(…)
    MemoryCache memoryCache 指定內存緩存的實現 DefaultConfigurationFactory.createMemoryCache(…) memoryCache(…)
    DiskCache diskCache 指定磁盤緩存的實現 DefaultConfigurationFactory.createDiskCache(…); discCache(…)或者 diskCache(…)
    ImageDownloader downloader 圖片下載器,負責從圖片的各個來源獲取輸入流 imageDownloader(…) DefaultConfigurationFactory.createImageDownloader(context);
    ImageDecoder decoder 圖片解碼器,負責將圖片輸入流InputStream轉換為Bitmap對象 DefaultConfigurationFactory.createImageDecoder(writeLogs); imageDecoder(…)
    DisplayImageOptions defaultDisplayImageOptions; 缺省的圖片顯示的配置項 DisplayImageOptions.createSimple(); defaultDisplayImageOptions(…)
    ImageDownloader networkDeniedDownloader 不允許訪問網絡的圖片下載器 networkDeniedDownloader = new NetworkDeniedImageDownloader(downloader);
    ImageDownloader slowNetworkDownloader 慢網絡情況下的圖片下載器 slowNetworkDownloader = new SlowNetworkImageDownloader(downloader);

    (2) DisplayImageOptions各屬性解釋

    l 創建默認的DisplayImageOptions:

    DisplayImageOptions option_0 = DisplayImageOptions.createSimple();

    l 也可以自定義DisplayImageOptions:

    DisplayImageOptions類Field詳解

    Filed名稱 Field意義 缺省默認值 Builder中設置方法
    int imageResOnLoadingDrawable imageOnLoading 圖片下載期間顯示的圖片 0 showStubImage(…)或者showImageOnLoading(…)
    int imageResForEmptyUriDrawable imageForEmptyUri 空 uri 時的占位圖片 0 showImageForEmptyUri(…)
    int imageResOnFailDrawable imageOnFail 圖片下載失敗時展示圖片
    showImageOnFail(…)
    boolean resetViewBeforeLoading 在加載前是否重置 view false resetViewBeforeLoading()或者resetViewBeforeLoading(…)
    boolean cacheInMemory 是否啟用內存緩存 false cacheInMemory()或者cacheInMemory(…)
    boolean cacheOnDisk 是否啟用磁盤緩存 false cacheOnDisc()或者cacheOnDisc(…)

    或者cacheOnDisk(…)

    ImageScaleType imageScaleType 圖片的縮放類型 ImageScaleType.IN_SAMPLE_POWER_OF_2 imageScaleType(ImageScaleType imageScaleTy)
    Options decodingOptions 為 BitmapFactory.Options,用于BitmapFactory.decodeStream(imageStream, null, decodingOptions)得到圖片尺寸等信息 Options decodingOptions = new Options(); bitmapConfig(Bitmap.Config bitmapConfig)decodingOptions(Options decodingOptions)
    int delayBeforeLoading 設置在開始加載前的延遲時間,單位為毫秒 0 delayBeforeLoading(int delayInMillis)
    boolean considerExifParams 是否考慮圖片的 EXIF 信息(括機身、鏡頭型號、拍攝時間、相機快門次數) false considerExifParams(…)
    Object extraForDownloader 下載器需要的輔助信息 null extraForDownloader(Object extra)
    BitmapProcessor preProcessor 緩存在內存之前的處理程序 null preProcessor(…)
    BitmapProcessor postProcessor 緩存在內存之后的處理程序 null postProcessor(…)
    BitmapDisplayer displayer 圖片的顯示方式 DefaultConfigurationFactory.createBitmapDisplayer(); displayer(…)
    Handler handler handler 對象,消息處理 null handler(…)
    boolean isSyncLoading 是否同步加載 false syncLoading(…)

    (3) 自定義配置總結:

    1) Imageloader提供的缺省的ImageLoaderConfiguration和缺省的DisplayImageOptions已經基本可以滿足我們正常的需求,如果沒有特殊的需要可以不用再修改;2) ImageLoaderConfiguration的Builder中的diskCache()方法, diskCacheSize() 方法以及diskCacheFileCount()方法彼此功能重疊的,如果設置了其中一個,就不要再設置其他的了;

    3) ImageLoaderConfiguration的Builder中的diskCache()方法 和 diskCacheFileNameGenerator()方法彼此功能重疊的,如果設置了其中一個,就不要再設置其他的了;

    4) ImageLoaderConfiguration的Builder中的memoryCache() 方法和memoryCacheSize()方法 彼此功能重疊的,如果設置了其中一個,就不要再設置其他的了。

    1.2.補充理解:三大關鍵對象關系

    1) ImageLoader:

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

    2) ImageLoaderConfiguration:

    圖片緩存的全局配置,主要有線程類、緩存大小、磁盤大小、圖片下載與解析、日志方面的配置

    3) DisplayImageOptions:

    指導每一個Imageloader根據網絡圖片的狀態(空白、下載錯誤、正在下載)顯示對應的圖片,是否將緩存加載到磁盤上,下載完后對圖片進行怎么樣的處理

    4) 三者關系的形象比喻:

    這三者就像是公司執行機構、公司規章制度以及客戶需求,ImageLoaderConfiguration就像一個公司的規章制度,里面規定了一個公司全局性的性質;ImageLoader就像是一個公司的執行機構,會給客戶創造出客戶想要的產品;DisplayImageOptions就像是每一個客戶的具體需求,公司執行結構會根據這個需求最終決定如何生產那個產品。

    2.各式緩存方式任你選擇

    2.1.DiskCache 磁盤緩存

    1) UnlimitedDiscCache不限制緩存大小;2) UnlimitedDiscCache很簡單它只是簡單的繼承了BaseDiscCache并未對BaseDiscCache做任何擴展;

    3) LimitedAgeDiscCache限制緩存時間;

    4) LimitedAgeDiscCache該類實現了在緩存中刪除被加載超過規定時間的文件:滿足以下條件的時候就從緩存中刪除文件:系統當前時間-文件的最新修改時間 > maxFileAge;

    2.2.MemoryCache內存緩存

    1) 通過實現接口MemoryCacheAware <String,Bitmap>來實現自己的緩存

    2) UsingFreqLimitedCache (最少被用到的對象會被刪除)

    3) UsingAgeLimitedCache (最早被添加的對象會被刪除)

    4) LargestLimitedCache (空間占用最大的對象會被刪除)

    5) FIFOLimitedCache (根據先進先出的原則上刪除多余對象)
    2.3.不要忘記緩存的清理

    一般要在整個應用結束的時候調用下面兩個方法,分別情況內存緩存和磁盤緩存,提高用戶體驗 :

    i. imageLoader.clearMemoryCache();

    ii. imageLoader.clearDiskCache();

    3. 網絡圖片獲取想停就停

    主要是用于GirdView,ListView加載圖片的情況,因為這兩個控件展示圖片的時候會出現滑動操作,為了更友好的用戶體驗,可以設置GirdView,ListView的setOnScrollListener監聽事件。

    listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));gridView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));

    pauseOnScroll—是否在滑動過程中停止加載圖片

    pauseOnFling—是否在快速猛的滑動中停止加載圖片

    4.圖像大小由你控制

    在ImageLoadingListener接口有以下幾個狀態監聽,用于監聽圖片下載的不同狀態:

    1) onLoadingStarted(String imageUri, View view);2) onLoadingFailed(String imageUri, View view, FailReason failReason);

    3) onLoadingComplete(String imageUri, View view, Bitmap loadedImage):

    在圖片加載成功之后,可以對獲取到的Bitmap進行各種大小設置,圖形裁剪操作以及動畫效果添加等,

    最后再加圖片展示到控件上。

    4) onLoadingCancelled(String imageUri, View view)。

    5.注意事項

    使用了ImageLoader可以有效的避免程序加載圖片出現OOM的情況,但是也不是百分之百的屏蔽這個問題,在有的時候,還是會出現,這個時候,我們 可以從下面幾個思路去優化我們的ImageLoader

    1) 減少配置之中線程池的大小,(.threadPoolSize).推薦1-5;2) 使用.bitmapConfig(Bitmap.config.RGB_565)代替ARGB_8888;

    3) 使用.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者 try.imageScaleType(ImageScaleType.EXACTLY);

    4) 避免使用RoundedBitmapDisplayer.他會創建新的ARGB_8888格式的Bitmap對象;

    5) 使用.memoryCache(new WeakMemoryCache()),不要使用.cacheInMemory();

    6.下載地址:
    https://github.com/nostra13/Android-Universal-Image-Loader

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!