android 代码优化建议


本文来自别的网站或者自己优化的代码

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

 

 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值