文档章节

什么时候会自溢,BOY们你懂吗?

磨砺营
 磨砺营
发布于 2016/10/14 11:33
字数 1122
阅读 5
收藏 0

【威哥说】感谢大家的大力支持, 昨天微信号里要爆棚了,让我惊讶不已,再次感谢大家,请受威哥一拜!提醒大家务必把邀请的名单发到美女老师的QQ里,以免漏了统计哈。活动结束后会统一公布领取视频的方式。

【活动链接】威哥视频获取通道

我们在开发应用的过程中,总是会出现崩溃错误,那么,这是为什么呢?由于什么导致又如何避免呢?今天,我们就来总结下Android中的内存问题!

(一)查询数据库没有关闭游标 (二) 构造Adapter时,没有使用缓存的 convertView (三) Bitmap对象不在使用时调用recycle()释放内存 (四) 释放对象的引用

(一) 查询数据库没有关闭游标

【描述】 程序中经常会进行查询数据库的操作,但是经常会有使用完毕Cursor后没有关闭的情况。如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险。

【示例代码】

Cursor cursor = getContentResolver().query(uri ...); if (cursor.moveToNext()) { ... ...
}

【修正示例代码】

Cursor cursor = null; try { cursor = getContentResolver().query(uri ...); if (cursor != null && cursor.moveToNext()) { ... ...
} } finally { if (cursor != null) { try {
cursor.close(); } catch (Exception e) { //ignore this } } }

(二) 构造Adapter时,没有使用缓存的 convertView

【描述】

以构造ListView的BaseAdapter为例,在BaseAdapter中提高了方法:

public View getView(int position, View convertView, ViewGroup parent)

来向ListView提供每一个item所需要的view对象。初始时ListView会从BaseAdapter中根据当前的屏幕布局实例化一定数量的 view对象,同时ListView会将这些view对象缓存起来。当向上滚动ListView时,原先位于最上面的list item的view对象会被回收,然后被用来构造新出现的最下面的list item。这个构造过程就是由getView()方法完成的,getView()的第二个形参 View convertView就是被缓存起来的list item的view对象(初始化时缓存中没有view对象则convertView是null)。

由此可以看出,如果我们不去使用convertView,而是每次都在getView()中重新实例化一个View对象的话,即浪费资源也浪费时间,也会使得内存占用越来越大。ListView回收list item的view对象的过程可以查看:android.widget.AbsListView.java --> void addScrapView(View scrap) 方法。

【示例代码】

public View getView(int position, View convertView, ViewGroup parent) { View view = new Xxx(...); ... ... return view; }

【修正示例代码】

public View getView(int position, View convertView, ViewGroup parent) { View view = null; if (convertView != null) { view = convertView; populate(view, getItem(position)); ... } else { view = new Xxx(...); ... } return view; }

(三) Bitmap对象不在使用时调用recycle()释放内存

【描述】

有时我们会手工的操作Bitmap对象,如果一个Bitmap对象比较占内存,当它不在被使用的时候,可以调用Bitmap.recycle()方法回收此对象的像素所占用的内存,但这不是必须的,视情况而定。可以看一下代码中的注释:

/**

  • Free up the memory associated with this bitmap's pixels, and mark the
  • bitmap as "dead", meaning it will throw an exception if getPixels() or
  • setPixels() is called, and will draw nothing. This operation cannot be
  • reversed, so it should only be called if you are sure there are no
  • further uses for the bitmap. This is an advanced call, and normally need
  • not be called, since the normal GC process will free up this memory when
  • there are no more references to this bitmap. */

(四) 释放对象的引用

【描述】

这种情况描述起来比较麻烦,举两个例子进行说明。

【 示例A】假设有如下操作

public class DemoActivity extends Activity { ... ... private Handler mHandler = ... private Object obj; public void operation() { obj = initObj(); ... [Mark] mHandler.post(new Runnable() { public void run() { useObj(obj); } }); } }

我们有一个成员变量 obj,在operation()中我们希望能够将处理obj实例的操作post到某个线程的MessageQueue中。在以上的代码中,即便是 mHandler所在的线程使用完了obj所引用的对象,但这个对象仍然不会被垃圾回收掉,因为DemoActivity.obj还保有这个对象的引用。 所以如果在DemoActivity中不再使用这个对象了,可以在[Mark]的位置释放对象的引用,而代码可以修改为:

... ... public void operation() { obj = initObj(); ... final Object o = obj; obj = null; mHandler.post(new Runnable() { public void run() { useObj(o); } } }

【完】

© 著作权归作者所有

磨砺营
粉丝 6
博文 80
码字总数 97977
作品 0
昌平
私信 提问
JDK8 Stream 从入门到装逼(三)

在lambdas中,可以看到lambda表达式让代码更加简洁、干净、容易理解,并允许不需要创建一个类就可以达到目的。lambdas很好的帮助开发人员更好的表达片段代码的意思,Stream对于集合提供一个抽...

kaishui
2016/09/06
2.5K
11
不会拒绝,就等于不会做工作。拒绝不合理要求的五个关键

欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定! 对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴...

天善智能
2018/06/01
0
0
python Qwebpage爬js动态内容网页

python2.7 最近想爬百度旅游的页面,遇到一些javascript动态问题,采用了Qwebkit,但不太懂原理? 1.能帮忙解释下这段代码的运行机制吗? 主要是这几个函数什么时候调用 什么时候结束? self...

tina437213
2013/10/12
1.2K
0
cocos2dx3.2 action基础用法(有趣)

动作到底该怎么玩?说的也就是runAction这货了。 如果你觉得本文还是在写像MoveTo,SacleTo这类动作的用法的话,那你就错了。那样不够厚道。当然了,像Sequence,Spawn这类的东西多少也是会涉及...

千山万水
2014/09/22
3.5K
1
Ext.Class 属性详解

1 , alias : 相当于别名一样,可以起多个,可以通过xtype和Ext.widget()创建实例: Ext.define('SimplePanel', { extend: 'Ext.panel.Panel', alias: ['widget.simplepanel_007','widget.simpl......

enosh
2014/12/17
258
0

没有更多内容

加载失败,请刷新页面

加载更多

处理CSV文件中的逗号

我正在寻找有关如何处理正在创建的csv文件的建议,然后由我们的客户上传,并且该值可能带有逗号(例如公司名称)。 我们正在研究的一些想法是:带引号的标识符(值“,”值“,”等)或使用|...

javail
40分钟前
21
0
如何克隆一个Date对象?

将Date变量分配给另一个变量会将引用复制到同一实例。 这意味着更改一个将更改另一个。 如何实际克隆或复制Date实例? #1楼 简化版: Date.prototype.clone = function () { return new ...

技术盛宴
今天
58
0
计算一个数的数位之和

计算一个数的数位之和 例如:128 :1+2+8 = 11 public int numSum(int num) { int sum = 0; do { sum += num % 10; } while ((num = num / 10) > 0); return sum;......

SongAlone
今天
67
0
为什么图片反复压缩后普遍会变绿,而不是其他颜色?

作者:Lion Yang 链接:https://www.zhihu.com/question/29355920/answer/119088684 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 业余版概要:安卓的...

shzwork
今天
47
0
每天AC系列(二):最接近的三数之和

1 题目 leetcode第16题,给定一个数组与一个目标数,找出数组中其中的三个数,这三个数的和要与目标数最接近。 2 暴力 按惯例先来一次O(n3)的暴力: int temp = nums[0]+nums[1]+nums[2];fo...

Blueeeeeee
今天
46
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部