您的位置:首页 > 移动开发 > Android开发

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);

优化建议:此方法会略微降低性能,但是能减少代码编写量
       

@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

 

 


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: