android 代码优化建议
2014-05-28 10:01
417 查看
本文来自别的网站或者自己优化的代码
1 ViewHolder优化
一般写法:
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(xxxx, false);
}
itemHolder = (ViewHolder)convertView.getTag();
if(itemHolder == null)
{
itemHolder = new ViewHolder();
itemHolder.nameTextView = (TextView)convertView.findViewById(xxxx);
convertView.setTag(itemHolder);
}
itemHolder.nameTextView.setText(xxxx);
优化建议:此方法会略微降低性能,但是能减少代码编写量
使用方法
2 android 内存注意
Android每一个应用的堆内存大小有限
1、 通常的情况为16M-48M
2、 通过ActivityManager的getMemoryClass()来查询可用堆内存限制
3、3.0(HoneyComb)以上的版本可以通过largeHeap=“true”来申请更多的堆内存 Nexus S(4.2.1):normal
192, largeHeap 512
常见内存泄露原因(下面地址里面总结很多,这里就复制一部分)
http://www.eoeandroid.com/forum.php?mod=viewthread&tid=334686
Context对象泄漏
1、如果一个类持有Context对象的强引用,就需要检查其生存周期是否比Context对象更长。否则就可能发生Context泄漏。
2、View持有其创建所在Context对象的引用,如果将View对象传递给其它生存周期比View所在Context更长的强引用,就可能会引起内存泄漏。
例如View#setTag(int, Object)的内存泄漏https://code.google.com/p/android/issues/detail?id=18273
3、把Context对象赋给static变量。
避免Context对象泄漏Checklist
1、检查所有持有对Context对象强引用的对象的生命周期是否超出其所持有的Context对象的生命周期。
2、检查有没有把View传出到View所在Context之外的地方,如果有的话就需要检查生命周期。
3、工具类中最好不要有Context成员变量,尽量在调用函数时直接通过调用参数传入。如果必须有Context成员变量时,可以考虑使用WeakReference来引用Context对象。
4、View持有其创建所在Context对象的引用,如果将View对象传递给其它生存周期比View所在Context更长的强引用,就可能会引起内存泄漏。
5、 检查把Context或者View对象赋给static变量的地方,看是否有Context泄漏。
6、检查所有把View放入容器类的地方(特别是static容器类),看是否有内存泄漏。7、使用WeakHashMap也需要注意有没有value-key的引用。
7、尽量使用ApplicationContext。
补充 :progressbar这样的控件不要在代码下使用,在xml里面写好布局,在控制显隐效果更好
3 常用写法的优化
我们在一个点击事件处理多个button时候,可能会这样写
switch(v.getId())
case R.id.xxxx
break;
case R.id.xxxx
break;
请替换成if else 这个在高一些的adt版本有提示
嵌套循环 请把次数少的放在最外层
不要在循环内部声明对象,正确写法
Object object;
for()
{
object = new Object()
}
关于类的get set,此类方法会降低效率,如果近从程序运行效率考虑最好不要写,直接设置对象public
用线程池代替new thread和timer
1 ViewHolder优化
一般写法:
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(xxxx, false);
}
itemHolder = (ViewHolder)convertView.getTag();
if(itemHolder == null)
{
itemHolder = new ViewHolder();
itemHolder.nameTextView = (TextView)convertView.findViewById(xxxx);
convertView.setTag(itemHolder);
}
itemHolder.nameTextView.setText(xxxx);
优化建议:此方法会略微降低性能,但是能减少代码编写量
@SuppressWarnings("unchecked") public static <T extends View> T getViewHolderView(View view, int id) { SparseArray<View> viewHolder = (SparseArray<View>) view.getTag(); if (viewHolder == null) { viewHolder = new SparseArray<View>(); view.setTag(viewHolder); } View childView = viewHolder.get(id); if (childView == null) { childView = view.findViewById(id); viewHolder.put(id, childView); } return (T) childView; }
使用方法
@Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(context).inflate(xxx, false); } TextView nameTextview = getViewHolderView(convertView, R.id.banana); nameTextview.setText(xxxxxx); return convertView; }
2 android 内存注意
Android每一个应用的堆内存大小有限
1、 通常的情况为16M-48M
2、 通过ActivityManager的getMemoryClass()来查询可用堆内存限制
3、3.0(HoneyComb)以上的版本可以通过largeHeap=“true”来申请更多的堆内存 Nexus S(4.2.1):normal
192, largeHeap 512
常见内存泄露原因(下面地址里面总结很多,这里就复制一部分)
http://www.eoeandroid.com/forum.php?mod=viewthread&tid=334686
Context对象泄漏
1、如果一个类持有Context对象的强引用,就需要检查其生存周期是否比Context对象更长。否则就可能发生Context泄漏。
2、View持有其创建所在Context对象的引用,如果将View对象传递给其它生存周期比View所在Context更长的强引用,就可能会引起内存泄漏。
例如View#setTag(int, Object)的内存泄漏https://code.google.com/p/android/issues/detail?id=18273
3、把Context对象赋给static变量。
避免Context对象泄漏Checklist
1、检查所有持有对Context对象强引用的对象的生命周期是否超出其所持有的Context对象的生命周期。
2、检查有没有把View传出到View所在Context之外的地方,如果有的话就需要检查生命周期。
3、工具类中最好不要有Context成员变量,尽量在调用函数时直接通过调用参数传入。如果必须有Context成员变量时,可以考虑使用WeakReference来引用Context对象。
4、View持有其创建所在Context对象的引用,如果将View对象传递给其它生存周期比View所在Context更长的强引用,就可能会引起内存泄漏。
5、 检查把Context或者View对象赋给static变量的地方,看是否有Context泄漏。
6、检查所有把View放入容器类的地方(特别是static容器类),看是否有内存泄漏。7、使用WeakHashMap也需要注意有没有value-key的引用。
7、尽量使用ApplicationContext。
补充 :progressbar这样的控件不要在代码下使用,在xml里面写好布局,在控制显隐效果更好
3 常用写法的优化
我们在一个点击事件处理多个button时候,可能会这样写
switch(v.getId())
case R.id.xxxx
break;
case R.id.xxxx
break;
请替换成if else 这个在高一些的adt版本有提示
嵌套循环 请把次数少的放在最外层
不要在循环内部声明对象,正确写法
Object object;
for()
{
object = new Object()
}
关于类的get set,此类方法会降低效率,如果近从程序运行效率考虑最好不要写,直接设置对象public
用线程池代替new thread和timer
相关文章推荐
- android代码官方建议优化
- Android代码内存优化建议-OnTrimMemory优化
- 优化android代码的10点建议
- Android代码内存优化建议-OnTrimMemory优化
- Android代码内存优化建议-OnTrimMemory优化
- 12条在android开发中的代码优化建议
- Android 代码性能优化建议
- Android 代码性能优化建议
- Android代码内存优化建议-OnTrimMemory优化
- Android代码优化的10条小建议
- Android代码内存优化建议-OnTrimMemory优化
- 优化android代码的10点建议
- android开发中的代码优化建议
- android代码优化相关的小建议
- 优化PHP代码的40条建议
- 优化PHP代码的40条建议
- 优化PHP代码的40条建议
- 优化PHP代码的40条建议
- 优化PHP代码的40条建议
- 呵呵,请帮忙检查一下代码的安全性,以及给点建议优化一下。