全面解析Android的开源图片框架Universal-Image-Loader

2019-12-10 18:34:04丽君

源代码解读

ImageView mImageView = (ImageView) findViewById(R.id.image); 
  String imageUrl = "https://www.easck.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s1024/A%252520Photographer.jpg"; 
   
  //显示图片的配置 
  DisplayImageOptions options = new DisplayImageOptions.Builder() 
    .showImageOnLoading(R.drawable.ic_stub) 
    .showImageOnFail(R.drawable.ic_error) 
    .cacheInMemory(true) 
    .cacheOnDisk(true) 
    .bitmapConfig(Bitmap.Config.RGB_565) 
    .build(); 

            
        ImageLoader.getInstance().displayImage(imageUrl, mImageView, options);    
大部分的时候我们都是使用上面的代码去加载图片,我们先看下

public void displayImage(String uri, ImageView imageView, DisplayImageOptions options) { 
  displayImage(uri, new ImageViewAware(imageView), options, null, null); 
 } 

从上面的代码中,我们可以看出,它会将ImageView转换成ImageViewAware, ImageViewAware主要是做什么的呢?该类主要是将ImageView进行一个包装,将ImageView的强引用变成弱引用,当内存不足的时候,可以更好的回收ImageView对象,还有就是获取ImageView的宽度和高度。这使得我们可以根据ImageView的宽高去对图片进行一个裁剪,减少内存的使用。
接下来看具体的displayImage方法啦,由于这个方法代码量蛮多的,所以这里我分开来读

checkConfiguration(); 
  if (imageAware == null) { 
   throw new IllegalArgumentException(ERROR_WRONG_ARGUMENTS); 
  } 
  if (listener == null) { 
   listener = emptyListener; 
  } 
  if (options == null) { 
   options = configuration.defaultDisplayImageOptions; 
  } 
 
  if (TextUtils.isEmpty(uri)) { 
   engine.cancelDisplayTaskFor(imageAware); 
   listener.onLoadingStarted(uri, imageAware.getWrappedView()); 
   if (options.shouldShowImageForEmptyUri()) { 
    imageAware.setImageDrawable(options.getImageForEmptyUri(configuration.resources)); 
   } else { 
    imageAware.setImageDrawable(null); 
   } 
   listener.onLoadingComplete(uri, imageAware.getWrappedView(), null); 
   return; 
  }