android 减少内存占用,Android减少内存占用专题.doc

Android减少内存占用专题

Android减少内存占用专题

Android开发经验:不要动不动就分配内存

2011-03-21

开发Andorid应用的开发者都知道,要尽量减少new关键字的使用,因为在手机上GC释放一次内存是一件恐怖的事情,如果你查看一下调试记录,你会发现GC释放内存时有时会花上几百毫秒的时间可以想象,如果你开发的是游戏,这时你的FPS会下降到多少。

虽然这个原则大家都知道,我们还是会看到一些开发者会出现类似问题,这又是为什么呢?呵呵,其实这是一些隐式的对象创建在作怪,看看以下代码:

原则1:如果可能,请不要使用可变参数

public void test(Object ... args) {

for(Object aObj: args) {

}

}

当外部调用时:

test(1,"some string",false);

系统会自动创建一个临时的数组对象类似于

Object[] args=new Object[]{1,"some string",false};

如果该函数经常被调用,则会极大增加GC的压力所以,如果可能,请不要使用可变参数。

原则2:如果可能,请用StringBuilder代替字符串的相加

我们来看一段代码:

public void test2() {

String tmp = "Hello!" + "some one.";

}

系统会将这句翻译成为如下格式:

StringBuilder sb = new StringBuilder();sb.append("Hello!");sb.append("some one");String tmp = sb.toString();

这本身没有什么问题,但如果是如下就有意思了:

public void test2() {

String tmp = "Hello!" + "some one.";

tmp += "you age is " + 13;

}

这段代码等效于:

StringBuilder sb1 = new StringBuilder();sb1.append("Hello!");sb1.append("some one.");tmp = sb1.toString();...StringBuilder sb2 = new StringBuilder();sb2.append(tmp);sb2.append("your age is ");sb2.append(13);tmp = sb2.toString();...

这样是不是悲剧,本来StringBuilder被无意义的重复创建了多次,期间还在数字转换到文本时创建了String所以请直接使用显示的StringBuilder来链接字符串。

原则3:尽量将不变的东东设置为常数,特别是字符串

较有效的办法是,你的代码可以这样来写:

public class TestClass {

private static final String STR_HELLO = "Hello!";

private static final String STR_YOU_AGE_IS = "you age is ";

private static final int PIx100 = (int)(Math.PI*100);

}

当然,即使这样做了,后续对文本操作(如整数到文本转换)然是一件费时费力的或,原因是JAVA中,String是只读的,任何String的内容操作均隐含了new关键字。作者在实际工作中只好采取了更笨笨的办法,自己实现了一个GString类来替代常用的文本操作,其原理时使用预分配的字节内存,只在需要时才转换为String对象。

Android进阶:性能优化篇

2011-05-11

一、OutOfMemoryError异常

在使用Gallery控件时,如果载入的图片过多,过大,就很容易出现OutOfMemoryError异常,就是内存溢出。这是因为Android默认分配的内存只有几M,而载入的图片如果是JPG之类的压缩格式,在内存中展开时会占用大量的空间,也就容易内存溢出。这时可以用下面的方法解决:

ImageView i = new ImageView(mContext);

BitmapFactory.Options options=new BitmapFactory.Options();

options.inSampleSize = 10;

//貌似这个options的功能是返回缩略图,10即表示长和宽为原来的1/10,即面积为原来的1/100

//缩略图可以减少内存占用

Bitmap bm = BitmapFactory.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值