内存泄漏和溢出

来源:互联网 发布:查看linux下的用户 编辑:程序博客网 时间:2024/05/16 17:59

图片的内存不足 内存溢出
可能是你加载的当前的图片占用内存大于当前剩余内存,解决方法就是及时释放内存,不显
示的图片要释放掉。也可能是你加载的图片是空的,导致内存不足。android系统给图片分
配的内存只有8M,当加载大量图片时往往会出现OOM。
Android加载大量图片内存溢出解决方案:
1)尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来
设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成
的,需要消耗更多内存,可以通过BitmapFactory.decodeStream方法,创建出一个bitmap,
再将其设为ImageView的 source
2)使用BitmapFactory.Options对图片进行压缩
InputStream is = this.getResources().openRawResource(R.drawable.pic1);
BitmapFactory.Options options=new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inSampleSize = 10; //width,hight设为原来的十分一
Bitmap btp =BitmapFactory.decodeStream(is,null,options);
3)运用Java软引用,进行图片缓存,将需要经常加载的图片放进缓存里,避免反复加载
及时销毁不再使用的Bitmap对象
if(!bmp.isRecycle() ){
bmp.recycle() //回收图片所占的内存
system.gc() //提醒系统及时回收
}
内存泄漏:也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释
放,结果导致一直占据该内存单元。
Handler在发送延时消息时会产生“内存泄漏”,在进行屏幕旋转的时候,activity会
被销毁,然后再重建,再切屏(横竖屏切换),结果就会出现内存泄漏。
内存泄漏分析:在切屏时,activity想要销毁,重建,那么Handler就也需要销毁,其
条件就是不能有任务或者Message,由于Handler中很有可能有任务要执行(是因为发送的是
延时任务),所以Handler就不能被销毁,它持有activity的引用,导致Activity销毁失
败。
解决办法:只需要在onDestroy()方法内加一条代码,就是handler内的所有任务和消
息都销毁清空即可。
handler.removeCallbackAndMdssage(null) 调用之后就不会出现内存泄漏

0 0
原创粉丝点击