12.Bitmap的加载和Cache

LruCache常被用作内存缓存,而DiskLruCache常被用作存储缓存。Lru是Least Recently Used的缩写,即最近最少使用算法,这种算法的核心思想为:当缓存快满时,会淘汰近期最少使用的缓存目标。

BitmapFactory类提供了四类方法:decodeFile、decodeResource、decodeStream和decodeByteArray,分别用于支持从文件系统、资源、输入流和字节数组中加载出一个Bitmap对象,其中decodeFile和decodeResource又间接调用了decodeStream方法,这四类方法最终是在Android的底层实现的,对应着BitmapFactory类的几个native方法。

通过BitmapFactory.Options来缩放图片,主要是用到了它的inSampleSize参数,即采样率。

LruCache是一个泛型类,它内部采用了一个LinkedHashMap以强引用的方式存储外界的缓存对象,其提供了get和put方法来完成缓存的获取和添加操作,当缓存满时,LruCache会依次较早使用的缓存对象,然后再添加新的缓存对象。

  • 强引用,直接的对象引用
  • 软引用,当一个对象只有软引用存在时,系统内存不足时此对象会被gc回收
  • 弱引用,当一个对象只有弱引用存在时,此对象会随时被gc回收
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
int cacheSize = maxMemory / 8;
mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
    @Override
    protected int sizeOf(String key, Bitmap bitmap) {
        return bitmap.getRowBytes() * bitmap.getHeight() / 1024;
    }
}

DiskLruCache用于实现存储设备缓存,即磁盘缓存,它通过将缓存对象写入文件系统从而实现缓存的效果。

results matching ""

    No results matching ""