Bitmap加载、缓存机制

在Android开发中经常会遇到关于图片加载、缓存的问题,经常会遇到内存溢出OOM,Android对单个应用内存加载的限制16MB。关于本篇文章从三个方面进行分析图片加载中遇到的问题:Bitmap压缩、缓存机制、优化卡顿

Bitmap压缩

关于Bitmap高效加载,BitmapFactory进行图片解压缩步骤:

1、将BitmapFacory.Options的injustDecodeBounds参数设为TRUE并加载图片;

2、从BitmapFactory.Options中取出图片的原始宽高信息,对应outWidth和outHeight参数;

3、根据采样率的规则并结合目标View所需大小计算出采样率inSampleSize;

4、将Bitmapfactory.Options的inJustDecodeBounds参数设置为FALSE,然后重新加载图片。

缓存机制

首先要考虑图片的三级缓存机制,通过网络、本地、内存三级缓存图片,来减少不必要的网络交互,避免浪费流量

网络加载,不优先加载,速度慢,浪费流量

本地缓存,次优先加载,速度快

内存缓存,优先加载,速度最快

1、LRUCache(least Recently Used)最近最少使用算法,采用LRU算法缓存包括LRUCache和DiskLRUCache。利用这二者可以实现使用ImageLoader。LRUCache是Android3.1提供缓存类,通过support-v4兼容之前的版本,是一个泛型类,采用linkedHashmap以强引用的方式存储外界对象

2、DiskLRUCache实现磁盘缓存。将缓存对象写入文件系统实现缓存数据,DiskLRUCache得到Android官方文档推荐,不属于AndroidSDK的一部分,源码可在网络自行下载。DiskLRUCache采用open方法创建自身

2.1、DiskLRUCache缓存对象写入

通过edit()获取Editor对象,通过它获取一个文件输出流想文件系统中写入数据,并通过Editor.commit()提交写入操作。如果图片下载过程发生异常,还可以通过Editor的abort()方法退回操作。

2.2、DiskLRUCache缓存查找

首先通过url转换成key,DiskLruCache的get方法获取Snapshot对象,通过Snapshot对象得到缓存的文件输入流。

优化列表卡顿

禁止在getView执行耗时操作,直接在getView中加载图片将会直接影响显示效果,必须通过ImageLoader实现异步操作;

控制异步任务执行频率,通过给ListView or GridView设置setOnScrollListenser.onScrollStateChanged方法中增加判断列表是否处于滑动状态决定执行加载图片操作

开启硬件加速

监控内存变化情况

然后在打开DDMS, 选择Heap标签,然后点击Cause GC按钮,点击Cause GC是手动触发JAVA垃圾回收器,如下图

Bitmap加载、缓存机制_第1张图片

针对Bitmap加载是否会产生内存泄露,我们可以反复进入和退出这个Activity, 再手动触发几次垃圾回收,观察上图中 data object这一栏中的 Total Size的大小是保持稳定还是有明显的变大趋势,如果有明显的变大趋势就说明这个Activity存在内存泄露的问题,我们就需要在具体分析。

你可能感兴趣的:(Bitmap加载、缓存机制)