《Android开发艺术探索》第十二章Bitmap加载和Cache小结

1. Bitmap的高效加载

1)BitmapFactory提供了decodeFile(decodeFileDescriptor),decodeResource,decodeStream和decodeByteArray分别用于从文件、资源、输入流以及字节数组中加载Bitmap对象;

2)修改BitmapFactory.Options的inSampleSize采样率来加载所需尺寸的图片;将BitmapFactory.Options的inJustDecodeBounds设置为true并加载图片,取出原始宽高outWidth和outHeight,计算出采样率,再把inJustDecodeBounds设置为false加载图片;

3)缓存策略:当应用打算从网络请求图片时,首先从内存中获取,如果内存中没有则从存储设备中获取,还没有再从网络上下载,从网上下载后先保存到本地缓存中,然后从本地缓存读取图片,读取的同时保存到内存缓存中,然后再显示;

4)强引用是直接的引用,当一个对象只有软引用时系统内存不足会被gc掉,只有弱引用时会随时被gc;

5)LruCache,get(key), put(key, bitmap), remove(key)

int cacheSize = (int)(Runtime.getRuntime().maxMemory() / 1024);

new LruCache(cacheSize) {

    protected int sizeOf(String key, Bitmap bitmap){

        return bitmap.getRowBytes() * bitmap.getHeight() / 1024;

    }

}

6)static DiskLruCache open(File dir, int appVersion, valueCount, long maxSize)

第一个参数指/sdcard/Android/data/package_name/cache目录,当应用被卸载后此目录会一并删除,如果希望卸载后保留缓存就要选择SD卡上的其它目录;

第二个参数表示版本号,一般为1,变更后会导致所有缓存被清空;

第三个参数表示节点对应的数据个数,一般为1;

第四个参数表示缓存大小。

File diskCacheDir = getDiskCacheDir(mContext, "bitmap");

if(!diskCacheDir.exists()) {

    diskCacheDir.mkdirs();

}

mDiskLruCache = DiskLruCache.open(diskCacheDir, 1, 1, DISK_CACHE_SIZE);

7)ImageLoader应具有的功能:同步异步加载、内存和硬盘缓存、网络加载、图片压缩

8)使用线程池来实现图片下载任务的添加,ImageView的tag中保存下载的url地址,与下载完的图片进行比对,如果相同才显示,避免View缓存导致图片显示错乱;

9)优化列表卡顿:在getView中异步加载Image,在列表滑动的时候停止加载图片,开启硬件加速;

你可能感兴趣的:(Android)