一起动手编写Android图片加载框架

2019-12-10 18:16:05王冬梅

    从以上代码中我们可以看到创建mMainHandler时使用了主线程的Looper,因此构造mMainHandler的代码可以放在子线程中执行。另外,注意以上代码中我们在给imageView设置图片时首先判断了下它的url是否等于result中的url,若相等才显示。我们知道ListView会对其中Item的View进行复用,刚移出屏幕的Item的View会被即将显示的Item所复用。那么考虑这样一个场景:刚移出的Item的View中的图片还在未加载完成,而这个View被新显示的Item复用时图片加载好了,那么图片就会显示在新Item处,这显然不是我们想看到的。因此我们通过判断imageView的url是否与刚加载完的图片的url是否相等,并在

只有两者相等时才显示,就可以避免以上提到的情况。

 2. 图片的缓存

(1)缓存的创建
我们在图片加载框架类(FreeImageLoader)的构造方法中初始化LruCache和DiskLruCache,相关代码如下:

private LruCache<String, Bitmap> mMemoryCache;
private DiskLruCache mDiskLruCache;

private ImageLoader(Context context) {
  mContext = context.getApplicationContext();
  int maxMemory = (int) (Runtime.getRuntime().maxMemory() /1024);
  int cacheSize = maxMemory / 8;
  mMemorySize = new LruCache<String, Bitmap>(cacheSize) {
    @Override
    protected int sizeof(String key, Bitmap bitmap) {
      return bitmap.getByteCount() / 1024;
    }
  };
  File diskCacheDir = getAppCacheDir(mContext, "images");
  if (!diskCacheDir.exists()) {
    diskCacheDir.mkdirs();
  }
  if (diskCacheDir.getUsableSpace() > DISK_CACHE_SIZE) { 
    //剩余空间大于我们指定的磁盘缓存大小
    try {
      mDiskLruCache = DiskLruCache.open(diskCacheDir, 1, 1, DISK_CACHE_SIZE);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

(2)缓存的获取与添加
内存缓存的添加与获取我们已经介绍过,只需调用LruCache的put与get方法,示例代码如下:

private void addToMemoryCache(String key, Bitmap bitmap) {
  if (getFromMemoryCache(key) == null) {
    //不存在时才添加
    mMemoryCache.put(key, bitmap);
  }
}

private Bitmap getFromMemoryCache(String key) {
  return mMemoryCache.get(key);
}