日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Android優(yōu)化ListView實(shí)踐

在看了一些vogella的文章之后,發(fā)現(xiàn)關(guān)于android listview性能優(yōu)化這一段很有意思,于是實(shí)踐了一下,經(jīng)過優(yōu)化,性能確實(shí)提升不少!

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比紅橋網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式紅橋網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋紅橋地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴。

先看看優(yōu)化前和優(yōu)化后的比較:

優(yōu)化前的log截圖:

優(yōu)化后的log截圖:

并且,在不停滾動(dòng)ListView的過程中,優(yōu)化之前會(huì)出現(xiàn)ANR現(xiàn)象,在AVD上特別容易復(fù)現(xiàn):

然后,優(yōu)化后顯得很流暢,附上對(duì)于的log截圖:

下面附上相關(guān)代碼分析:

ListView中的每一個(gè)Item由一個(gè)ImageView 和一個(gè)TextView組成

Layout:

 
 
 
  1.  
  2. android:layout_width="fill_parent" 
  3. android:layout_height="fill_parent" 
  4. android:orientation="horizontal" > 
  5. android:layout_width="wrap_content" 
  6. android:layout_height="fill_parent" />" 
  7. android:layout_width="wrap_content" 
  8. android:layout_height="fill_parent" 
  9. android:layout_marginLeft="15dp" 
  10. android:gravity="center_vertical" /> 
  11.  

Activity繼承自ListActivity,我故意增加了Item,方便測(cè)試,效果更明顯:

 
 
 
  1. public class ListViewDemo extends ListActivity{ 
  2. private final String[] mItems = new String[] { "Android", "iPhone", 
  3. "WindowsMobile", "Blackberry", "WebOS", "Ubuntu", "Windows7", 
  4. "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", 
  5. "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", 
  6. "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", 
  7. "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", 
  8. "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", 
  9. "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", 
  10. "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", 
  11. "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", 
  12.  "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", 
  13. "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", 
  14. "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", 
  15. "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", 
  16. "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", 
  17.  "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", 
  18. "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", 
  19. "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", 
  20. "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", 
  21.  "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", 
  22.  "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", 
  23. "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", 
  24. "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", 
  25. "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", 
  26. "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", 
  27. "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", 
  28. "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", 
  29. "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2" }; 
  30.  @Override 
  31. public void onCreate(Bundle savedInstanceState) { 
  32.     super.onCreate(savedInstanceState); 
  33.      ListViewArrayAdapter adapter = new ListViewArrayAdapter(this, mItems); 
  34.       getListView().setAdapter(adapter); 
  35.     } 

然后custom Adapter,優(yōu)化之前的adapter:

 
 
 
  1. @Override 
  2.       public View getView(int position, View convertView, ViewGroup parent) { 
  3.         long start = System.currentTimeMillis(); 
  4.         LayoutInflater inflater = (LayoutInflater) mContext.getLayoutInflater(); 
  5.         View rowView = inflater.inflate(mViewResourceId, parent, false); 
  6.         TextView textView = (TextView) rowView 
  7.                 .findViewById(mTextViewResourceId); 
  8.         ImageView imageView = (ImageView) rowView 
  9.                 .findViewById(mImageViewResourceId); 
  10.         textView.setText(mNames[position]); 
  11.         String s = mNames[position]; 
  12.         if (s.startsWith("Windows7") || s.startsWith("iPhone")) { 
  13.             imageView.setImageResource(R.drawable.no); 
  14.         } else { 
  15.             imageView.setImageResource(R.drawable.yes); 
  16.         } 
  17.               
  18.        Log.v("jerikc","cost time = " + (System.currentTimeMillis() - start)); 
  19.       return rowView; 

優(yōu)化之后的Adapter:

 
 
 
  1. public class ListViewArrayAdapter extends ArrayAdapter
  2.        private final Activity mContext; 
  3.        private final String[] mNames; 
  4.        private final static int mViewResourceId = R.layout.text_image_row_layout; 
  5.        private final static int mTextViewResourceId = R.id.textView; 
  6.        private final static int mImageViewResourceId = R.id.imageView; 
  7.     static class ViewHolder { 
  8.         public TextView text; 
  9.         public ImageView image; 
  10.     }     
  11.        public ListViewArrayAdapter(Activity context, String[] names) { 
  12.         super(context, mViewResourceId, names);  
  13.         this.mContext = context; 
  14.         this.mNames = names; 
  15.         } 
  16. @Override 
  17.     public View getView(int position, View convertView, ViewGroup parent) { 
  18.        long start = System.currentTimeMillis(); 
  19.         View rowView = convertView; 
  20.      if (rowView == null) { 
  21.          LayoutInflater inflater = mContext.getLayoutInflater(); 
  22.           rowView = inflater.inflate(mViewResourceId, null); 
  23.          ViewHolder viewHolder = new ViewHolder(); 
  24.         viewHolder.text = (TextView) rowView.findViewById(mTextViewResourceId); 
  25.         viewHolder.image = (ImageView) rowView.findViewById(mImageViewResourceId); 
  26.          rowView.setTag(viewHolder); 
  27.         } 
  28.        ViewHolder holder = (ViewHolder) rowView.getTag(); 
  29.        String s = mNames[position]; 
  30.        holder.text.setText(s); 
  31.       if (s.startsWith("Windows7") || s.startsWith("iPhone")) { 
  32.           holder.image.setImageResource(R.drawable.no); 
  33.         } else { 
  34.            holder.image.setImageResource(R.drawable.yes); 
  35.        } 
  36.        Log.v("jerikc","cost time = " + (System.currentTimeMillis() - start)); 
  37.         return rowView; 
  38.     } 

優(yōu)化的大致思想就是:優(yōu)化之前,每次加載item的時(shí)候,都要加載一下布局文件,然后生成一個(gè)新的row View對(duì)象,然后通過View找到對(duì)應(yīng)的ImageView和TextView,正如我們所知道的那樣,加載布局文件時(shí)很耗時(shí)的,特別是在操作比較頻繁 情況下,這是不可忍受的,所以會(huì)導(dǎo)致ANR現(xiàn)象。

因此,我們可以重復(fù)利用已不可見的row View對(duì)象。Android中,當(dāng)它決定讓row View對(duì)象不可見的時(shí)候,它允許通過getView方法中的convertView參數(shù)來重復(fù)利用剛剛不可見的row View對(duì)象。

在優(yōu)化的過程中,第一次加載的時(shí)候,我們需要把相關(guān)的數(shù)據(jù)保存起來,而View有一個(gè)方法setTag,該方法可用來保存一些數(shù)據(jù)結(jié)構(gòu)。我們一個(gè)row View對(duì)象是由ImageView和TextView空間組成的,因此定義一個(gè)ViewHolder來保存ImageView和TextView對(duì)象。 在重復(fù)利用的過程中,只需簡(jiǎn)單修改它們的值,而不用再次findViewById。


當(dāng)前題目:Android優(yōu)化ListView實(shí)踐
文章位置:http://www.dlmjj.cn/article/dpphpse.html