Android Universalimageloader 源码分析

【】整体的框架思路

Android Universalimageloader 源码分析_第1张图片

【】带线程安全的单例模式.

Android Universalimageloader 源码分析_第2张图片

 

【】涉及线程安全的函数写法

Android Universalimageloader 源码分析_第3张图片

异步线程下载库源码分析:

github上的例子:

Android Universalimageloader 源码分析_第4张图片

源码分解:

源码分解二:

上面的 displayImage(uri, imageView.... 传入下面的函数,然后调用ImageViewAware(imageView),

ViewAware.java

WeakReference是什么?

http://blog.csdn.net/qlsusu/article/details/7822511(详解)

http://wenku.baidu.com/view/8c04b0d249649b6648d74786.html

总结:WeakReference负责了:释放策略.

 public ViewAware(View view, boolean checkActualViewSize) {
  if (view == null) throw new IllegalArgumentException("view must not be null");
  this.viewRef = new WeakReference<View>(view);
  this.checkActualViewSize = checkActualViewSize;
 }

ImageLoader.java

【】displayImage

 public void displayImage(String uri, ImageAware imageAware, DisplayImageOptions options,
   ImageLoadingListener listener, ImageLoadingProgressListener progressListener) {
  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;
  }
   //计算Bitmap的大小,以便后面解析图片时用
  ImageSize targetSize = ImageSizeUtils.defineTargetSizeForView(imageAware, configuration.getMaxImageSize());
  String memoryCacheKey = MemoryCacheUtils.generateKey(uri, targetSize);
  engine.prepareDisplayTaskFor(imageAware, memoryCacheKey);
  listener.onLoadingStarted(uri, imageAware.getWrappedView());
  //Bitmap是否缓存在内存?
  Bitmap bmp = configuration.memoryCache.get(memoryCacheKey);
  if (bmp != null && !bmp.isRecycled()) {
   L.d(LOG_LOAD_IMAGE_FROM_MEMORY_CACHE, memoryCacheKey);
   if (options.shouldPostProcess()) {
    ImageLoadingInfo imageLoadingInfo = new ImageLoadingInfo(uri, imageAware, targetSize, memoryCacheKey,
      options, listener, progressListener, engine.getLockForUri(uri));
      //处理并显示图片
     ProcessAndDisplayImageTask displayTask = new ProcessAndDisplayImageTask(engine, bmp, imageLoadingInfo,
      defineHandler(options));
    if (options.isSyncLoading()) {
     displayTask.run();
    } else {
     engine.submit(displayTask);
    }
   } else {
    //显示图片
    ptions.getDisplayer().display(bmp, imageAware, LoadedFrom.MEMORY_CACHE);
    listener.onLoadingComplete(uri, imageAware.getWrappedView(), bmp);
   }
  } else {
   if (options.shouldShowImageOnLoading()) {
    imageAware.setImageDrawable(options.getImageOnLoading(configuration.resources));
   } else if (options.isResetViewBeforeLoading()) {
    imageAware.setImageDrawable(null);
   }
   ImageLoadingInfo imageLoadingInfo = new ImageLoadingInfo(uri, imageAware, targetSize, memoryCacheKey,
     options, listener, progressListener, engine.getLockForUri(uri));
   LoadAndDisplayImageTask displayTask = new LoadAndDisplayImageTask(engine, imageLoadingInfo,
     defineHandler(options));
   if (options.isSyncLoading()) {
    displayTask.run();
   } else {
    engine.submit(displayTask);
   }
  }
 }

 

【】loadImage

public void loadImage(String uri, ImageSize targetImageSize, DisplayImageOptions options,
   ImageLoadingListener listener, ImageLoadingProgressListener progressListener) {
  checkConfiguration();
  if (targetImageSize == null) {
   targetImageSize = configuration.getMaxImageSize();
  }
  if (options == null) {
   options = configuration.defaultDisplayImageOptions;
  }
  NonViewAware imageAware = new NonViewAware(uri, targetImageSize, ViewScaleType.CROP);
  displayImage(uri, imageAware, options, listener, progressListener);
 }

【】loadImageSync

public Bitmap loadImageSync(String uri, ImageSize targetImageSize, DisplayImageOptions options) {
  if (options == null) {
   options = configuration.defaultDisplayImageOptions;
  }
  options = new DisplayImageOptions.Builder().cloneFrom(options).syncLoading(true).build();
  SyncImageLoadingListener listener = new SyncImageLoadingListener();
  loadImage(uri, targetImageSize, options, listener);
  return listener.getLoadedBitmap();
 }

【】线程池 ExecutorService

 

【】

 

【】

fdfdf

你可能感兴趣的:(Android Universalimageloader 源码分析)