谈谈关于Android程序UI的性能优化

转自:http://www.cnblogs.com/kchen/archive/2011/08/02/How_To_Inprove_Android_UI_Performance.html

声明

  欢迎转载,但请保留文章原始出处:) 

    博客园:http://www.cnblogs.com

    kchen: http://www.cnblogs.com/kchen/

新浪微博:http://weibo.com/kchen30 

 

自从06年以后,就没有写过博客了,不是因为没时间,而是因为懒了,现在又重新拾起来,有些感触。

 

先说说View的界面原理吧

 

一个Activity大致是这样的结构,当界面发生变化的时候(比如动画,点击,滚动条滚动,界面刷新)都需要一层层的重绘界面,最终将所有VISIBLE显示的VIEW全部重绘为止,也就是说,当滚动条从滚动的时候,会调用NVIEWonMeasure, dispatchDraw,onDraw方法,其中如果当前VIEW有背景的情况下,那么会调用onDrawdispatchDraw方法,如果没有背景,那么只调用dispatchDraw方法。

 

所以,想要提高UI的性能,首先需要做的事情,就是减少不必要的onMeasure,dispatchDraw,onDraw调用。

 

打个比方,当通过调用Viewlayout方法来实现VIEW在界面上覆盖时,尽量将被遮住的VIEW隐藏起来,特别是一些绘制起来比较大的VIEW,如ListView,GridView等。

 

下面再谈谈ListViewGridView的性能优化

1、关于Google IO大会关于Adapter的优化,参考以下文章:

      Android开发之ListView 适配器(Adapter)优化

      Android开发——09Google I/O之让Android UI性能更高效(1)

2、在这里我要说的是另一种方法

 

 private class MyAdapter extends BaseAdapter{

复制代码
        ArrayList < String >  List;
        Context ctx;
        
public  BookAdapter(Context c,ArrayList < String >  list){
            List 
=  list;
            ctx 
=  c;
            BuildViewList();
        }
        
        View[] viewList;
        
        
private   void  BuildViewList()
        {
            viewList 
=   new  View[List.size()];
        }
        
        @Override
        
public   int  getCount() {
            
return  List.size();
        }

        @Override
        
public  Object getItem( int  position) {
            
//  TODO Auto-generated method stub
             return  position;
        }

        @Override
        
public   long  getItemId( int  position) {
            
//  TODO Auto-generated method stub
             return  position;
        }

        @Override
        
public  View getView( int  position, View convertView, ViewGroup parent) {
            View layout 
=  viewList[position];
            
// 如果该View没有初始化,那么初始化它,并且放入缓存数组
             if  (layout  ==   null )
            {
                
final  LayoutInflater inflater  =  LayoutInflater.from(ctx);
                
//  给ImageView设置资源
                layout  =  (LinearLayout)inflater.inflate(R.layout.listitem,  null );
                                
                TextView txtName 
=  (TextView)layout.findViewById(R.id.txtBookName);
                txtName.setText(List.get(position))
                viewList[position] 
=  layout;
            }
            
return  layout;
        }
        
    }
复制代码

 

 这种方式可以有效的减少inflatefindViewById的性能开销,并且不需要每次都重新给View赋值,

 

3、关于fill_parent和wrap_content,fill_parent比wrap_content的性能高很多,尽量使用fill_parent,具体原因下次写

 

先写这么多,以后继续写。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值