談談關於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,具體原因下次寫

 

先寫這麼多,以後繼續寫。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章