1. 程式人生 > >Universal-Image-Loader完全解析

Universal-Image-Loader完全解析

相信大家平時做Android應用的時候,多少會接觸到非同步載入圖片,或者載入大量圖片的問題,而載入圖片我們常常會遇到許多的問題,比如說圖片的錯亂,OOM等問題,對於新手來說,這些問題解決起來會比較吃力,所以就有很多的開源圖片載入框架應運而生,比較著名的就是Universal-Image-Loader,相信很多朋友都聽過或者使用過這個強大的圖片載入框架,今天這篇文章就是對這個框架的基本介紹以及使用,主要是幫助那些沒有使用過這個框架的朋友們。該專案存在於Github上面,我們可以先看看這個開源庫存在哪些特徵

  1. 多執行緒下載圖片,圖片可以來源於網路,檔案系統,專案資料夾assets中以及drawable中等
  2. 支援隨意的配置ImageLoader,例如執行緒池,圖片下載器,記憶體快取策略,硬碟快取策略,圖片顯示選項以及其他的一些配置
  3. 支援圖片的記憶體快取,檔案系統快取或者SD卡快取
  4. 支援圖片下載過程的監聽
  5. 根據控制元件(ImageView)的大小對Bitmap進行裁剪,減少Bitmap佔用過多的記憶體
  6. 較好的控制圖片的載入過程,例如暫停圖片載入,重新開始載入圖片,一般使用在ListView,GridView中,滑動過程中暫停載入圖片,停止滑動的時候去載入圖片
  7. 提供在較慢的網路下對圖片進行載入

當然上面列舉的特性可能不全,要想了解一些其他的特性只能通過我們的使用慢慢去發現了,接下來我們就看看這個開源庫的簡單使用吧

新建一個Android專案,下載JAR包新增到工程libs目錄下

新建一個MyApplication繼承Application,並在onCreate()中建立ImageLoader的配置引數,並初始化到ImageLoader中程式碼如下

  1. package com.example.uil;  
  2. import com.nostra13.universalimageloader.core.ImageLoader;  
  3. import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;  
  4. import android.app.Application;  
  5. publicclass MyApplication extends Application {  
  6.     @Override
  7.     publicvoid onCreate() {  
  8.         super.onCreate();  
  9.         //建立預設的ImageLoader配置引數
  10.         ImageLoaderConfiguration configuration = ImageLoaderConfiguration.createDefault(this);  
  11.         //Initialize ImageLoader with configuration.
  12.         ImageLoader.getInstance().init(configuration);  
  13.     }  
  14. }  

ImageLoaderConfiguration是圖片載入器ImageLoader的配置引數,使用了建造者模式,這裡是直接使用了createDefault()方法建立一個預設的ImageLoaderConfiguration,當然我們還可以自己設定ImageLoaderConfiguration,設定如下

  1. File cacheDir = StorageUtils.getCacheDirectory(context);  
  2. ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)  
  3.         .memoryCacheExtraOptions(480800// default = device screen dimensions
  4.         .diskCacheExtraOptions(480800, CompressFormat.JPEG, 75null)  
  5.         .taskExecutor(...)  
  6.         .taskExecutorForCachedImages(...)  
  7.         .threadPoolSize(3// default
  8.         .threadPriority(Thread.NORM_PRIORITY - 1// default
  9.         .tasksProcessingOrder(QueueProcessingType.FIFO) // default
  10.         .denyCacheImageMultipleSizesInMemory()  
  11.         .memoryCache(new LruMemoryCache(2 * 1024 * 1024))  
  12.         .memoryCacheSize(2 * 1024 * 1024)  
  13.         .memoryCacheSizePercentage(13// default
  14.         .diskCache(new UnlimitedDiscCache(cacheDir)) // default
  15.         .diskCacheSize(50 * 1024 * 1024)  
  16.         .diskCacheFileCount(100)  
  17.         .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
  18.         .imageDownloader(new BaseImageDownloader(context)) // default
  19.         .imageDecoder(new BaseImageDecoder()) // default
  20.         .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
  21.         .writeDebugLogs()  
  22.         .build();  

上面的這些就是所有的選項配置,我們在專案中不需要每一個都自己設定,一般使用createDefault()建立的ImageLoaderConfiguration就能使用,然後呼叫ImageLoader的init()方法將ImageLoaderConfiguration引數傳遞進去,ImageLoader使用單例模式。

配置Android Manifest檔案

  1. <manifest>
  2.     <uses-permissionandroid:name="android.permission.INTERNET"/>
  3.     <!-- Include next permission if you want to allow UIL to cache images on SD card -->
  4.     <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  5.     ...  
  6.     <applicationandroid:name="MyApplication">
  7.         ...  
  8.     </application>
  9. </manifest>

接下來我們就可以來載入圖片了,首先我們定義好Activity的佈局檔案
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent">
  5.     <ImageView
  6.         android:layout_gravity="center"
  7.         android:id="@+id/image"
  8.         android:src="@drawable/ic_empty"
  9.         android:layout_width="wrap_content"
  10.         android:layout_height="wrap_content"/>
  11. </FrameLayout>

裡面只有一個ImageView,很簡單,接下來我們就去載入圖片,我們會發現ImageLader提供了幾個圖片載入的方法,主要是這幾個displayImage(), loadImage(),loadImageSync(),loadImageSync()方法是同步的,android4.0有個特性,網路操作不能在主執行緒,所以loadImageSync()方法我們就不去使用

.

loadimage()載入圖片

我們先使用ImageLoader的loadImage()方法來載入網路圖片

  1. final ImageView mImageView = (ImageView) findViewById(R.id.image);  
  2.         String imageUrl = "http://pic36.nipic.com/20131217/6704106_233034463381_2.jpg";  
  3.         ImageLoader.getInstance().loadImage(imageUrl, new ImageLoadingListener() {  
  4.             @Override
  5.             publicvoid onLoadingStarted(String imageUri, View view) {  
  6.             }  
  7.             @Override
  8.             publicvoid onLoadingFailed(String imageUri, View view,  
  9.                     FailReason failReason) {  
  10.             }  
  11.             @Override
  12.             publicvoid onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {  
  13.                 mImageView.setImageBitmap(loadedImage);  
  14.             }  
  15.             @Override
  16.             publicvoid onLoadingCancelled(String imageUri, View view) {  
  17.             }  
  18.         });  
傳入圖片的url和ImageLoaderListener, 在回撥方法onLoadingComplete()中將loadedImage設定到ImageView上面就行了,如果你覺得傳入ImageLoaderListener太複雜了,我們可以使用SimpleImageLoadingListener類,該類提供了ImageLoaderListener介面方法的空實現,使用的是預設介面卡模式
  1. final ImageView mImageView = (ImageView) findViewById(R.id.image);  
  2.         String imageUrl = "http://pic36.nipic.com/20131217/6704106_233034463381_2.jpg";  
  3.         ImageLoader.getInstance().loadImage(imageUrl, new SimpleImageLoadingListener(){  
  4.             @Override
  5.             publicvoid onLoadingComplete(String imageUri, View view,  
  6.                     Bitmap loadedImage) {  
  7.                 super.onLoadingComplete(imageUri, view, loadedImage);  
  8.                 mImageView.setImageBitmap(loadedImage);  
  9.             }  
  10.         });  
如果我們要指定圖片的大小該怎麼辦呢,這也好辦,初始化一個ImageSize物件,指定圖片的寬和高,程式碼如下
  1. final ImageView mImageView = (ImageView) findViewById(R.id.image);  
  2. 相關推薦

    Android 開源框架Universal-Image-Loader完全解析(一)--- 基本介紹及使用

                    大家好!差不多兩個來月沒有寫文章了,前段時間也是在忙換工作的事,準備筆試面試什麼的事情,現在新工作找好了,新工作自己也比較滿意,唯一遺憾的就是自己要去一個新的城市,新的環境新的開始,希望自己能儘快的適應新環境,現在在準備交接的事情,自己也有一些時間了,所以就繼續給大家分享And

    Universal-Image-Loader完全解析

    相信大家平時做Android應用的時候,多少會接觸到非同步載入圖片,或者載入大量圖片的問題,而載入圖片我們常常會遇到許多的問題,比如說圖片的錯亂,OOM等問題,對於新手來說,這些問題解決起來會比較吃力,所以就有很多的開源圖片載入框架應運而生,比較著名的就是Univer

    Android 開源框架Universal-Image-Loader完全解析(二)--- 圖片快取策略詳解

    本篇文章繼續為大家介紹Universal-Image-Loader這個開源的圖片載入框架,介紹的是圖片快取策略方面的,如果大家對這個開源框架的使用還不瞭解,大家可以看看我之前寫的一篇文章Android 開源框架Universal-Image-Loader完全解析(一)---

    史上最全Universal-Image-Loader原始碼解析————核心程式碼篇

    背景 接著上一篇的內容,我們接著看ImageLoader的核心程式碼篇,上一篇主要是看ImageLoader的記憶體優化,主要包括磁碟快取和記憶體快取,還有就是記憶體的快取策略,這一篇,我們重點來看一下ImageLoader是如何使用這些記憶體和進行圖片的

    史上最全Universal-Image-Loader原始碼解析————快取篇

    背景 在我寫下這篇部落格的時候,我還是一名二本學校計算機專業大四的應屆畢業生,自學Android開發快兩年了,這兩年的時間裡面,其實真的是感慨萬千,兩年的時間裡面,Android的很多事情也都見識過了,其實Android對於新手入門在就業方面是相當不友好的事情。都說第一個吃螃蟹的人最

    深入解析開源專案之Universal-Image-Loader(二)快取篇

    Universal-Image-Loader 是一個優秀的圖片載入開源專案,Github地址在 (Github地址) ,很多童鞋都在自己的專案中用到了。優秀的專案從來都是把簡單留給開發者,把複雜封裝在框架內部。ImageLoader作為Github上S

    安卓圖片外掛Universal-Image-Loader解析

    連結地址 https://www.cnblogs.com/tianzhijiexian/p/4034215.html http

    Android 使用圖片異步載入框架Universal Image Loader的問題

    loader mar fill splay con iss text blog option 使用的Jar包 問題: optionsm = new DisplayImageOptions.Builder() .displayer(new

    (轉) Universal-Image-Loader使用大全(史上最屌)

    pools 設置 raw 到你 eight cti option 項目目錄 proc 轉載自http://blog.csdn.net/zenjj11/article/details/38728481 項目介紹: Android上最讓人頭疼的莫過於從網

    開源項目Universal Image Loader for Android 說明文檔 (1) 簡單介紹

    bst 成功 開源 ica ctu structure 使用 說明 由於  When developing applications for Android, one often facesthe problem of displa

    Android-Universal-Image-Loader三大組件DisplayImageOptions、ImageLoader、ImageLoaderConfiguration詳解

    根據 GridView ESS ted activit close except spa mat Android-Universal-Image-Loader三大組件DisplayImageOptions、ImageLoader、ImageLoaderConfigurati

    Android中使用Universal-Image-Loader圖片快取

    ImageLoader 是最早開源的 Android 圖片快取庫, 強大的快取機制, 早期被廣泛 Android 應用使用, 至今仍然有很多 Android 開發者在使用。 GitHub地址:

    Universal-Image-Loader的封裝

    Universal Image Loade介紹 UIL有很多的優點高度的可定製性,是我使用最多的圖片載入框架,今天就來整理下它的使用以及封裝的方法。 Features: Multithread image loading (async or sync) Wide

    Universal Image Loader for Android一些方法的引數

    DisplayImageOptions options = new DisplayImageOptions.Builder() // 設定圖片在下載期間顯示的圖片 .showImageOnLoading(R.drawable.ic_launcher)/

    universal image loader downlaod from https with post method

    Map<String, String> headers = new HashMap<String, String>(); headers.put(“key”, Commons.CURRENT_ACTIVE_PROFILE.getKey()); headers.put(“se

    Android Universal Image Loader學習筆記

    2、整個UIL庫分為ImageLoaderEngine,Cache及ImageDownloader,BitmapDisplayer,Bitmapprocessor ~流程:ImageLoader收到載入及顯示的任務,並將它交給ImageLoaderEngi

    Universal image loader遇到OOM

    Universal image loader應該不用介紹了,大家應該都很熟悉了,但是近來在使用時候遇到了OOM,呼叫棧如下: 07-24 13:01:24.876 31362 31362 E AndroidRuntime: java.lang.OutOfMemoryErro

    Universal-Image-Loader圖片非同步載入類庫

    這是 一個開源的Android關於下載顯示圖片的工具類,在這個下載包裡面jar檔案,用於我們匯入專案使用,具體使用方法在包裡面也含有。下面是一個例子: 雙擊程式碼複製 1 2 <uses-permissionandroid:name="android.pe

    android Universal-Image-Loader

    一、介紹  (一)、概要:         Android-Universal-Image-Loader是一個開源的UI元件程式,該專案的目的是實現可重複使用的非同步影象載入、快取和顯示。所以,如果你的程式裡需要這個功能的話,使用它,因為已經封裝

    Android載入圖片 Universal-Image-Loader圖片快取問題

            開發中大部分情況下我們需要快取圖片,用imageLoader兩步實現載入網路圖片後,快取到記憶體以及sd卡.再次讀取該圖片時先從記憶體找,有則直接載入,沒有則從sd卡找,再沒有則讀網路,這樣實現了三級快取. 1.初始化配置,ImageLoader是單例模式,