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

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

第22 -23行是将Bitmap设置到ImageView上面,这里我们可以在DisplayImageOptions中配置显示需求displayer,默认使用的是SimpleBitmapDisplayer,直接将Bitmap设置到ImageView上面,我们可以配置其他的显示逻辑, 他这里提供了FadeInBitmapDisplayer(透明度从0-1)RoundedBitmapDisplayer(4个角是圆弧)等, 然后回调到ImageLoadingListener接口

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); 
   } 

这段代码主要是Bitmap不在内存缓存,从文件中或者网络里面获取bitmap对象,实例化一个LoadAndDisplayImageTask对象,LoadAndDisplayImageTask实现了Runnable,如果配置了isSyncLoading为true, 直接执行LoadAndDisplayImageTask的run方法,表示同步,默认是false,将LoadAndDisplayImageTask提交给线程池对象
接下来我们就看LoadAndDisplayImageTask的run(), 这个类还是蛮复杂的,我们还是一段一段的分析

if (waitIfPaused()) return; 
if (delayIfNeed()) return; 

如果waitIfPaused(), delayIfNeed()返回true的话,直接从run()方法中返回了,不执行下面的逻辑, 接下来我们先看看

waitIfPaused()

private boolean waitIfPaused() { 
 AtomicBoolean pause = engine.getPause(); 
 if (pause.get()) { 
  synchronized (engine.getPauseLock()) { 
   if (pause.get()) { 
    L.d(LOG_WAITING_FOR_RESUME, memoryCacheKey); 
    try { 
     engine.getPauseLock().wait(); 
    } catch (InterruptedException e) { 
     L.e(LOG_TASK_INTERRUPTED, memoryCacheKey); 
     return true; 
    } 
    L.d(LOG_RESUME_AFTER_PAUSE, memoryCacheKey); 
   } 
  } 
 } 
 return isTaskNotActual(); 
}