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

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

      第7行我们调用了decodeSampledBitmapFromFD来从fileInputStream的文件描述符中解析出Bitmap,decodeSampledBitmapFromFD方法的定义如下:

public Bitmap decodeSampledBitmapFromFD(FileDescriptor fd, int dstWidth, int dstHeight) {
  final BitmapFactory.Options options = new BitmapFactory.Options();
  options.inJustDecodeBounds = true;
  BitmapFactory.decodeFileDescriptor(fd, null, options);
  //calInSampleSize方法的实现请见“Android开发之高效加载Bitmap”这篇博文
  options.inSampleSize = calInSampleSize(options, dstWidth, dstHeight);
  options.inJustDecodeBounds = false;
  return BitmapFactory.decodeFileDescriptor(fd, null, options);
}

     第9行我们调用了addBitmapToMemoryCache方法把获取到的Bitmap加入到内存缓存中,关于这一方法的具体实现下文会进行介绍。

三、图片加载框架的具体实现
1. 图片的加载

(1)同步加载
    同步加载的相关代码需要在工作者线程中执行,因为其中涉及到对网络的访问,并且可能是耗时操作。同步加载的大致步骤如下:首先尝试从内存缓存中加载Bitmap,若不存在再从磁盘缓存中加载,若不存在则从网络中获取并添加到磁盘缓存中。同步加载的代码如下:

public Bitmap loadBitmap(String url, int dstWidth, int dstHeight) {
  Bitmap bitmap = loadFromMemory(url);
  if (bitmap != null) {
    return bitmap;
  }
  //内存缓存中不存在相应图片
  try {
    bitmap = loadFromDisk(url, dstWidth, dstHeight);
    if (bitmap != null) {
      return bitmap;
    }
    //磁盘缓存中也不存在相应图片
    bitmap = loadFromNet(url, dstWidth, dstHeight);
  } catch (IOException e) {
    e.printStackTrace();
  }

  return bitmap;
}

    loadBitmapFromNet方法的功能是从网络上获取指定url的图片,并根据给定的dstWidth和dstHeight对它进行缩放,返回缩放后的图片。loadBitmapFromDisk方法则是从磁盘缓存中获取并缩放,而后返回缩放后的图片。关于这两个方法的实现在下面“图片的缓存”部分我们会具体介绍。下面我们先来看看异步加载图片的实现。