一:产生原因分析
每个Android应用程序运行时都有一定的内存限制,限制大小视平台而定,个手机开发厂商的标准都不相同,因此在开发应用时需要特别关注自身应用的内存使用量,否则就容易出现内存溢出的情况,既OOM异常。常见的OOM异常主要是由程序中图片过多过大引起的,Android图片中有好多处理图片的框架,如ImageLoader,Fresco等。
二:解决方案
(1)每个Android手机屏幕尺寸有限,分配给图像的显示区域本身也就更小,图像大小可以做适当调整。例如当一个手机屏幕宽和高=320x480,一个图片的宽和高=3648x2736,计算图片的缩放比例时,宽度缩放比例=3648/320=5,缩放后的图片宽度为3648/11=331,高度为2736/11=248,缩放后图片的大小为331x248=882088x2B=160kb.
在程序中,调整图片的大小需要通过options的inJustDecodeBounds属性为true,将图片的width和heigth属性读取出来。我们可以利用这些属性对Bitmap进行压缩,同时通过Options.inSampleSize属性可以设置图片的压缩比。
(2)及时回收不用的图片资源
及时回收不用的图片资源,如果引用大量的Bitmap对象,而应用中又不仅需要同时显示所有图片,因此可以将暂时不用的Bitmap对象及时回收掉。回收Bitmap对象的具体代码如下:
public void releaseImage{
if(null!=bitmap){
bitmap.recysle();
bitmap=null;
}
}
(3)缓存图片到内存中
在Android应用程序中,有一个LruCach类专门用于处理图片缓存。该类的一个特点是当缓存的图片达到了预定设置的值时,则该类内部会根据最近最少使用的算法,移除最近使用次数最少的图片,以达到防止OOM溢出的目的。这个预先设定的值时允许当前内存分配给图片使用的最大内存空间,这个内存空间的大小是根据项目实际需求自行定义的,但一般设置为内存大小的1/8。获取应用内存大小的具体代码如下;
int MAXMEMORY = (int)(Runtime.getRuntime().maxMemory()/1024);