Universal-Image-Loader(android圖片緩存)

轉載請註明http://write.blog.csdn.net/postedit?ref=toolbarjava

點擊下載所需jar文件
android

具體資料整理請加羣284568173自行下載pdf設計模式

項目介紹:緩存

Android上最讓人頭疼的莫過於從網絡獲取圖片、顯示、回收,不論什麼一個環節有問題均可能直接OOM。這個項目也許能幫到你。Universal Image Loader for Android的目的是爲了實現異步的網絡圖片載入、緩存及顯示,支持多線程異步載入。它最初來源於Fedor Vlasov的項目。且自此以後。通過大規模的重構和改進。網絡

特性列舉:多線程

  1. 多線程下載圖片。圖片可以來源於網絡。文件系統,項目目錄assets中以及drawable中等
  2. 支持任意的配置ImageLoader。好比線程池,圖片下載器,內存緩存策略。硬盤緩存策略,圖片顯示選項以及其它的一些配置
  3. 支持圖片的內存緩存。文件系統緩存或者SD卡緩存
  4. 支持圖片下載過程的監聽
  5. 依據控件(ImageView)的大小對Bitmap進行裁剪,下降Bitmap佔用過多的內存
  6. 較好的控制圖片的載入過程。好比暫停圖片載入,又一次開始載入圖片,通常使用在ListView,GridView中。滑動過程當中暫停載入圖片。中止滑動的時候去載入圖片
  7. 提供在較慢的網絡下對圖片進行載入

使用過程:app

建立默認的ImageLoader,所有的操做都由ImageLoader控制。框架

該類使用單例設計模式,因此假設要獲取該類的實力,需要調用getInstance()方法。異步

在使用ImageLoader顯示圖片以前,你首先要初始化它的配置。調用ImageLoaderConfiguration的init()方法,而後你就可以實現各類的顯示了。ide

        //建立默認的ImageLoader配置參數  
        ImageLoaderConfiguration configuration = ImageLoaderConfiguration  
                .createDefault(this);  
        //Initialize ImageLoader with configuration.  
        ImageLoader.getInstance().init(configuration); 


本身定義配置imageloader, 就像你已經知道的,首先。你需要使用ImageLoaderConfiguration對象來初始化ImageLoader。由於ImageLoader是單例,因此在程序開始的時候僅僅需要初始化一次就行了。建議你在Activity的onCreate()方法中初始化。假設一個ImageLoader已經初始化過,再次初始化不會有不論什麼效果。

如下咱們經過ImageLoaderConfiguration.Builder建立一個設置

File cacheDir =StorageUtils.getOwnCacheDirectory(this, "imageloader/Cache");
ImageLoaderConfigurationconfig = new ImageLoaderConfiguration 
          .Builder(this) 
          .memoryCacheExtraOptions(480, 800) // maxwidth, max height,即保存的每個緩存文件的最大長寬 
          .threadPoolSize(3)//線程池內載入的數量 
          .threadPriority(Thread.NORM_PRIORITY -2) 
          .denyCacheImageMultipleSizesInMemory() 
           .memoryCache(new UsingFreqLimitedMemoryCache(2* 1024 * 1024)) // You can pass your own memory cache implementation/你可以經過本身的內存緩存實現 
           .memoryCacheSize(2 * 1024 * 1024)   
          .discCacheSize(50 * 1024 * 1024)   
          .discCacheFileNameGenerator(newMd5FileNameGenerator())//將保存的時候的URI名稱用MD5 加密 
           .tasksProcessingOrder(QueueProcessingType.LIFO) 
           .discCacheFileCount(100) //緩存的文件數量 
           .discCache(new UnlimitedDiscCache(cacheDir))//本身定義緩存路徑 
           .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) 
           .imageDownloader(new BaseImageDownloader(this,5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超時時間 
           .writeDebugLogs() // Remove for releaseapp 
          .build();//開始構建 
ImageLoader.getInstance().init(config);


獲得imageLoader

ImageLoader imageLoader imageLoader = ImageLoader.getInstance();

使用過程:

(1)圖像操做是否參與緩存以及圖像效果的配置操做

DisplayImageOptions options = new DisplayImageOptions.Builder()
          .showImageOnLoading(R.drawable.ic_stub)            //載入圖片時的圖片
          .showImageForEmptyUri(R.drawable.ic_empty)         //沒有圖片資源時的默認圖片
          .showImageOnFail(R.drawable.ic_error)              //載入失敗時的圖片
          .cacheInMemory(true)                               //啓用內存緩存
          .cacheOnDisk(true)                                 //啓用外存緩存
          .considerExifParams(true)                          //啓用EXIF和JPEG圖像格式
          .displayer(new RoundedBitmapDisplayer(20))         //設置顯示風格這裏是圓角矩形
          .build();


DisplayImageOptions下面是所有默認配置參數依據需求可以本身定義配置

 
                   private int imageResOnLoading = 0;
                    private int imageResForEmptyUri = 0;
                    private int imageResOnFail = 0;
                    private Drawable imageOnLoading = null;
                    private Drawable imageForEmptyUri = null;
                    private Drawable imageOnFail = null;
                    private boolean resetViewBeforeLoading = false;
                    private boolean cacheInMemory = false;
                    private boolean cacheOnDisk = false;
                    private ImageScaleType imageScaleType = ImageScaleType.IN_SAMPLE_POWER_OF_2;
                    private Options decodingOptions = new Options();
                    private int delayBeforeLoading = 0;
                    private boolean considerExifParams = false;
                    private Object extraForDownloader = null;
                    private BitmapProcessor preProcessor = null;
                    private BitmapProcessor postProcessor = null;
                    private BitmapDisplayer displayer = DefaultConfigurationFactory.createBitmapDisplayer();
                    private Handler handler = null;
                    private boolean isSyncLoading = false;

(2)圖片載入監聽器在這裏吧可以設置載入時的動畫或者進度條之類的東西這裏

ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();
private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {
        static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());
         @Override
         public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
              if (loadedImage != null) {
                  ImageView imageView = (ImageView) view;
                  boolean firstDisplay = !displayedImages.contains(imageUri);
                  if (firstDisplay) {
                       FadeInBitmapDisplayer.animate(imageView, 500);
                       displayedImages.add(imageUri);
                    }
              }
        }
}


(3)簡單設置就可以給ImageView加入圖片了

imageLoader.displayImage(imageUrl, imageview, options, animateFirstListener);

對於本地的圖片 ,在其絕對地址前面要增長"file://"。

網絡圖片就直接寫路徑了。

由於個人這個是最新的包。可能跟曾經老的版本號不一樣,看到有些網友說的是:

String imageUri = "http://site.com/image.png"; // 網絡圖片
String imageUri = "file:///mnt/sdcard/image.png"; //SD卡圖片
String imageUri = "content://media/external/audio/albumart/13"; // 媒體目錄
String imageUri = "assets://image.png"; // assets
String imageUri = "drawable://" + R.drawable.image; //  drawable文件 

緩存的清理:

       緩存的清理可以按需求來定,可以再每個Activity的生命週期函數onDestroy中清理也可以單獨設置讓用戶自行清理。

          @Override
          public void onDestroy() {
                    super.onDestroy();
                    imageLoader.clearMemoryCache();
                    imageLoader.clearDiskCache();
          }


GirdView,ListView載入圖片:

相信大部分人都是使用GridView,ListView來顯示大量的圖片,而當咱們高速滑動GridView,ListView,咱們但願能中止圖片的載入,而在GridView,ListView中止滑動的時候載入當前界面的圖片,這個框架固然也提供這個功能,使用起來也很是easy,它提供了PauseOnScrollListener這個類來控制ListView,GridView滑動過程當中中止去載入圖片,該類使用的是代理模式

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

第一個參數就是咱們的圖片載入對象ImageLoader, 第二個是控制是否在滑動過程當中暫停載入圖片,假設需要暫停傳true便可了,第三個參數控制猛的滑動界面的時候圖片是否載入

OutOfMemoryError:

儘管這個框架有很是好的緩存機制,有效的避免了OOM的產生,通常的狀況下產生OOM的機率比較小。但是並不能保證OutOfMemoryError永遠不發生。這個框架對於OutOfMemoryError作了簡單的catch,保證咱們的程序遇到OOM而不被crash掉。但是假設咱們使用該框架經常發生OOM。咱們應該怎麼去改善呢?

下降線程池中線程的個數,在ImageLoaderConfiguration中的(.threadPoolSize)中配置,推薦配置1-5

在DisplayImageOptions選項中配置bitmapConfig爲Bitmap.Config.RGB_565,因爲默認是ARGB_8888, 使用RGB_565會比使用ARGB_8888少消耗2倍的內存

在ImageLoaderConfiguration中配置圖片的內存緩存爲memoryCache(newWeakMemoryCache()) 或者不使用內存緩存

在DisplayImageOptions選項中設置.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者imageScaleType(ImageScaleType.EXACTLY)

經過上面這些。相信你們對Universal-Image-Loader框架的使用已經很的瞭解了,咱們在使用該框架的時候儘可能的使用displayImage()方法去載入圖片,loadImage()是將圖片對象回調到ImageLoadingListener接口的onLoadingComplete()方法中,需要咱們手動去設置到ImageView上面,displayImage()方法中,對ImageView對象使用的是Weak references,方便垃圾回收器回收ImageView對象,假設咱們要載入固定大小的圖片的時候,使用loadImage()方法需要傳遞一個ImageSize對象,而displayImage()方法會依據ImageView對象的測量值,或者android:layout_width and android:layout_height設定的值,或者android:maxWidth and/or android:maxHeight設定的值來裁剪圖片
相關文章
相關標籤/搜索