博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android之内存泄露
阅读量:4579 次
发布时间:2019-06-09

本文共 1761 字,大约阅读时间需要 5 分钟。

  内存泄露,简称OOM(OutOfMemory)。区别于Web开发、PC端程序开发,Android程序开发有一个很大的限制:设备资源有限。当Android应用程序处理较大内存资源如图片、音乐、视频等多媒体资源时,在资源数量过多、处理时间太久的情况下,很容易耗尽设备资源,此时,内存泄露就发生了。

  那么,什么样的Android程序容易引起OOM呢?以下来自我开发Android应用程序的总结和网上收集的资料。

1.bitmap处理不当引起的OOM

  Bitmap占用资源大,很容易吃完内存,这也是内存溢出问题里最为常见的问题。

  为了有效优化处理Bitmap带给我们的内存问题,我们应当注意以下几点。

  a.及时销毁

  用完Bitmap后,要及时recycle。recycle不能保证立即释放Bitmap,但会给虚拟机一个暗示:"该图片可以释放了"。

if(!bitmapObject.isRecycle()){    bitmapObject.recycle();}

  b.适时使用软引用

  回收bitmap时调用recycle()方法,该方法只能在bitmap放弃所有引用的情况下才能回收,否则会报使用已回收的bitmap的错误。然而我们使用bitmap时,大多数时间是创建的局部变量,引用这些bitmap的控件却是全局的,或者说有更长的生命周期,所以回收bitmap要在控件不再引用该资源的情况下调用recycle()方法,这也是经常调用recycle()方法不成功而放弃回收bitmap的原因。另外,有些时候,我们使用Bitmap后没有保留对它的引用,因此就无法调用Recycle函数。这时候巧妙的运用软引用,可以使Bitmap在内存快不足时得到有效的释放。 

private class MyAdapter extends BaseAdapter {       private ArrayList> mBitmapRefs = new ArrayList>();      public View getView(int i, View view, ViewGroup viewGroup) {          View newView = null;          if(view != null) {              newView = view;          } else {              newView =(View)mInflater.inflate(R.layout.image_view, false);          }           Bitmap bitmap = BitmapFactory.decodeFile(mValues.get(i).fileName);          mBitmapRefs.add(new SoftReference(bitmap));     //此处加入ArrayList          ((ImageView)newView).setImageBitmap(bitmap);           return newView;      }  }

  c.适时减小生成的bitmap占用空间

  当要显示的区域很小,没必要将整个图片都加在出来,只需要加载一个缩小过的图片,可以设置适当的采样率,就可以有效减小占用的内存。

private ImageView preview;      BitmapFactory.Options options = new BitmapFactory.Options();      options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一      Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri), null, options);      preview.setImageBitmap(bitmap);

转载于:https://www.cnblogs.com/xuepeng0521/p/4670606.html

你可能感兴趣的文章
KMP预处理
查看>>
oracle的wm_concat函数实现行转列
查看>>
C语 三子棋小游戏
查看>>
[BZOJ 1861] 书架
查看>>
送给毕业生的一个学习建议
查看>>
基于redis+lua实现高并发场景下的秒杀限流解决方案
查看>>
Oracle 块修改跟踪 (Block Change Tracking) 说明
查看>>
阿里云 Redis 服务遇到的问题
查看>>
Jwt Token 安全策略使用 ECDSA 椭圆曲线加密算法签名/验证
查看>>
Window2008通过web.config进行限制ip访问
查看>>
浅析门户网站体育赛事CDN加速解决方案
查看>>
启动/关闭xp_cmdshell
查看>>
[PY3]——内置数据结构(8)——解构与封装
查看>>
进程、单线程和多线程
查看>>
python入门(3)python的解释器
查看>>
maven入门(1-3)构建简单的maven项目
查看>>
git 清除本地无效的分支
查看>>
poj1001--Exponentiation
查看>>
Python基础(迭代)
查看>>
webpack -p无效解决方式
查看>>