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

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

这个方法是干嘛用呢,主要是我们在使用ListView,GridView去加载图片的时候,有时候为了滑动更加的流畅,我们会选择手指在滑动或者猛地一滑动的时候不去加载图片,所以才提出了这么一个方法,那么要怎么用呢?  这里用到了PauseOnScrollListener这个类,使用很简单ListView.setOnScrollListener(new PauseOnScrollListener(pauseOnScroll, pauseOnFling )), pauseOnScroll控制我们缓慢滑动ListView,GridView是否停止加载图片,pauseOnFling 控制猛的滑动ListView,GridView是否停止加载图片
除此之外,这个方法的返回值由isTaskNotActual()决定,我们接着看看isTaskNotActual()的源码

private boolean isTaskNotActual() { 
  return isViewCollected() || isViewReused(); 
 } 

isViewCollected()是判断我们ImageView是否被垃圾回收器回收了,如果回收了,LoadAndDisplayImageTask方法的run()就直接返回了,isViewReused()判断该ImageView是否被重用,被重用run()方法也直接返回,为什么要用isViewReused()方法呢?主要是ListView,GridView我们会复用item对象,假如我们先去加载ListView,GridView第一页的图片的时候,第一页图片还没有全部加载完我们就快速的滚动,isViewReused()方法就会避免这些不可见的item去加载图片,而直接加载当前界面的图片

ReentrantLock loadFromUriLock = imageLoadingInfo.loadFromUriLock; 
  L.d(LOG_START_DISPLAY_IMAGE_TASK, memoryCacheKey); 
  if (loadFromUriLock.isLocked()) { 
   L.d(LOG_WAITING_FOR_IMAGE_LOADED, memoryCacheKey); 
  } 
 
  loadFromUriLock.lock(); 
  Bitmap bmp; 
  try { 
   checkTaskNotActual(); 
 
   bmp = configuration.memoryCache.get(memoryCacheKey); 
   if (bmp == null || bmp.isRecycled()) { 
    bmp = tryLoadBitmap(); 
    if (bmp == null) return; // listener callback already was fired 
 
    checkTaskNotActual(); 
    checkTaskInterrupted(); 
 
    if (options.shouldPreProcess()) { 
     L.d(LOG_PREPROCESS_IMAGE, memoryCacheKey); 
     bmp = options.getPreProcessor().process(bmp); 
     if (bmp == null) { 
      L.e(ERROR_PRE_PROCESSOR_NULL, memoryCacheKey); 
     } 
    } 
 
    if (bmp != null && options.isCacheInMemory()) { 
     L.d(LOG_CACHE_IMAGE_IN_MEMORY, memoryCacheKey); 
     configuration.memoryCache.put(memoryCacheKey, bmp); 
    } 
   } else { 
    loadedFrom = LoadedFrom.MEMORY_CACHE; 
    L.d(LOG_GET_IMAGE_FROM_MEMORY_CACHE_AFTER_WAITING, memoryCacheKey); 
   } 
 
   if (bmp != null && options.shouldPostProcess()) { 
    L.d(LOG_POSTPROCESS_IMAGE, memoryCacheKey); 
    bmp = options.getPostProcessor().process(bmp); 
    if (bmp == null) { 
     L.e(ERROR_POST_PROCESSOR_NULL, memoryCacheKey); 
    } 
   } 
   checkTaskNotActual(); 
   checkTaskInterrupted(); 
  } catch (TaskCancelledException e) { 
   fireCancelEvent(); 
   return; 
  } finally { 
   loadFromUriLock.unlock(); 
  }