• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      Android中的ListView組件原理分析與優(yōu)化

      2016-05-21 16:01:16李新輝
      計算機時代 2016年5期
      關鍵詞:優(yōu)化

      摘 要: ListView是開發(fā)Android應用程序中最常用的組件之一。分析了ListView基本工作機制和原理,提出了實際開發(fā)中合理使用ListView的必要性,闡述了提高ListView組件性能的四種優(yōu)化方法和思路。通過這幾種優(yōu)化手段,能有效幫助改善ListView的工作性能,增強應用程序的操作流暢性,從而帶來更佳的用戶體驗。

      關鍵詞: Android; ListView; 原理分析; 優(yōu)化

      中圖分類號:TP393.09 文獻標志碼:A 文章編號:1006-8228(2016)05-34-05

      Abstract: ListView is one of the most commonly used components in the development of Android application. This paper analyzes the basic working mechanism and principle of ListView, proposes the necessity of the reasonable use of ListView in practical development, and expounds four optimization methods and ideas to improve the performance of ListView components. These kinds of optimization methods can effectively help improving the performance of ListView, enhance the operation smoothness of the applications, and thus bring a better user experience.

      Key words: Android; ListView; principle analysis; optimization

      0 引言

      在開發(fā)Android應用時,通常都會用到Android SDK提供的一個名為ListView的組件。ListView能夠以列表行的形式展示數據,并且能夠根據數據的長度自適應顯示,比如手機里的通訊錄就是使用ListView來顯示聯系人的信息,還有像新聞類和社交APP等也都用到了ListView組件,如圖1所示。相比Button之類的簡單控件而言,ListView的使用要復雜一些,而且如果處理不當就很容易在程序運行時引起一些性能問題,從而給用戶留下不良的印象,因此掌握ListView的正確使用方法顯得很重要。

      1 ListView原理分析

      ListView組件中的每一行被稱為子項(Item),它既可以是一個文本信息,也可以是一個包含若干組件的布局視圖。ListView的設計遵循適配器模式,即:顯示的數據需通過一個中間角色的“適配器”提供,以確定數據的具體顯示外觀,這也導致ListView組件在使用上要比普通組件麻煩一些,但它具有較大的靈活性。

      ListView顯示列表元素需三方面配合,包括:展示數據的視圖(View)、適配器(Adapter)以及具體數據(Data)。ListView并不直接獲取數據進行展示,而是間接通過“適配器”來得到具體要展示的數據視圖。Android SDK預定義了幾種適配器類型,如SimpleAdapter等,但直接從BaseAdapter自定義派生類可以得到更大的靈活性。下面是一個名為MyAdapter的適配器的基礎代碼框架:

      2 ListView的應用優(yōu)化

      考慮到ListView是Android應用普遍涉及的一個關鍵組件,如果使用不當,將會產生比較常見的“卡頓”現象。因此,合理地使用它可以極大改善應用程序的性能,帶來更佳的用戶體驗。以下從四個方面考慮ListView的具體優(yōu)化方法。

      2.1 重用列表行視圖

      根據上面的分析,ListView需要借助Adapter適配器中的getView()得到顯示的列表行視圖對象。在getView()方法中,最簡單的編程做法示例如下:

      以上代碼雖然簡單直接,但卻反復加載布局導致延時和內存消耗等問題,在數據量大的情況下,會有嚴重影響??紤]到getView()方法的convertView參數本身就是系統返回的可重用列表行視圖對象,相當于這個視圖對象已經被滑動到屏幕之外,可以拿來重復使用,此時只需判斷convertView是否為null,以確定是手工產生新的視圖對象,還是重用這個返回的視圖對象[2]。優(yōu)化后的示例代碼如下:

      2.2 ViewHolder綁定

      重用系統返回的列表行視圖對象,可以大大減少反復加載布局界面的次數。既然列表行視圖對象可被重用,意味著這個視圖對象中的子控件也是原來的。上面的示例代碼中,每次定位子控件都使用findViewById()方法,盡管這樣做沒有問題,但反復調用將導致布局界面子控件的一次又一次的遍歷,特別是在ListView快速滑動時,白白浪費了手機的處理時間。為避免這個問題,可把復用的列表行視圖對象中的子控件引用地址保存起來[3],以省卻重復定位子控件過程。為了達到目的,我們先根據具體業(yè)務需求,定義一個名為ViewHolder的靜態(tài)內部類,其成員變量就是列表行視圖對象中所需的子控件引用:

      2.3 觸摸滑動優(yōu)化

      在通過網絡獲取的數據量不大的情況下,或者數據本身存在于設備上,ListView的性能一般不會成為重點考慮的問題。但如果涉及到大量的后臺數據,此時應合理規(guī)劃ListView的滑動時機,適時加載顯示數據。當用戶正在操作時,如果上下滑動速度快,列表行視圖就要切換得快,此時列表行視圖的切換速度就容易成為一個瓶頸。這需要充分考慮ListView的狀態(tài)以決定是否加載數據。如果ListView處于快速滾動的狀態(tài),我們可以讓getView()方法返回一個只有空數據的視圖對象,只有ListView處于普通速度觸摸滑動,或者在靜止空閑狀態(tài)的時候,才真正加載數據以更新列表視圖顯示的內容[4]。

      為了做到這一點,可以利用ListView的onScrollStateChanged()方法,以便開發(fā)者根據當前ListView的狀態(tài)來決定做何種處理,包括空閑(IDLE)、普通滑動(SCROLL)、快速滾動(FLING)等三種:

      在這里,我們定義了一個int型變量scrollState來指示ListView的當前狀態(tài),開發(fā)者可以在適配器的getView()方法中根據scrollState的值,決定是加載數據還是返回一個空視圖。

      2.4 網絡數據本地緩存

      對于從網絡下載的數據,為節(jié)省手機流量,一般都要使用SQLite將其緩存到設備的存儲卡上,當ListView上下滑動時,應首先檢查設備本地是否已經存在緩存的數據,如果沒有就啟動線程將數據下載并緩存起來。由于SQLite是一個內置于Android的微型數據庫,像圖片之類的二進制數據就不適合存儲。盡管可以將下載的圖片以文件保存,不過,圖片的顯示卻是一個費時和消耗內存的過程,特別是在ListView快速滑動時,很容易因為圖片加載和內存反復垃圾收集造成卡頓現象,甚至處理不當還會引發(fā)內存溢出等問題。此時,可以使用LruCache緩存技術解決這個問題[5]。LruCache的基本原理是把最近使用的對象緩存起來,當內存占用達到一定水平時,把“最近最少使用”的對象從內存中移除,避免產生OutOfMemory異常。LruCache還可以結合文件緩存一起使用,LruCache充當一級緩存,文件充當二級緩存。如果LruCache中存在所需圖像,ListView直接顯示即可。如果LruCache中沒有但存儲卡上有圖片文件,此時就加載圖像到內存,緩存到LruCache并送給ListView顯示。只有當LruCache和存儲卡上均不存在所需圖像時,才啟動線程從網絡下載。當圖片下載完畢,在保存文件到存儲卡的同時,還將圖像加載到LruCache中。通過這種機制,可以讓ListView快速地加載和顯示圖片,即使是在加載大量圖像的情況下,仍能得到較高的界面響應速度和流暢性。

      3 總結

      本文介紹了Android應用開發(fā)中最常用的ListView組件的基本工作原理,闡述了ListView組件在開發(fā)中的四種優(yōu)化方法。有關ListView性能的兩個因素是,在適配器的getView()方法中不要執(zhí)行耗時的任務,也不要改行布局的尺寸。如果確需執(zhí)行耗時操作,可借助線程或線程池的方式進行異步任務處理,或者采取預加載機制。盡管ListView的使用比較簡單,但也存在局限性,比如修改數據時必須要調用notifyDataSetChanged()通知適配器,而且要實現比較復雜的動畫效果時就顯得有點力不從心。這種情況下,可以考慮使用功能更強的RecyclerView組件,當然其使用方法也更為靈活和復雜。

      參考文獻(References):

      [1] 李新輝,鄒紹芳.Android移動應用開發(fā)項目教程[M].人民郵電出版社,2014.

      [2] 黃宏程,胡敏,陳如松.Android移動應用設計與開發(fā)[M].人民郵電出版社,2014.

      [3] 楊豐盛.Android應用開發(fā)揭秘[M].機械工業(yè)出版社,2010.

      [4]丁振凡,吳小元.Android系統ListView控件數據遞增顯示研究[J].智能計算機與應用,2014.4(2):49-53

      [5] 王向輝,張國印,沈潔.Android應用程序開發(fā)[M]. 清華大學出版社,2010.

      猜你喜歡
      優(yōu)化
      超限高層建筑結構設計與優(yōu)化思考
      房地產導刊(2022年5期)2022-06-01 06:20:14
      民用建筑防煙排煙設計優(yōu)化探討
      關于優(yōu)化消防安全告知承諾的一些思考
      一道優(yōu)化題的幾何解法
      由“形”啟“數”優(yōu)化運算——以2021年解析幾何高考題為例
      基于低碳物流的公路運輸優(yōu)化
      方正县| 元阳县| 昌江| 罗平县| 天台县| 西平县| 德清县| 绵阳市| 兴化市| 大姚县| 辽源市| 德安县| 宣武区| 罗山县| 凤庆县| 襄樊市| 锦州市| 昌宁县| 微山县| 漯河市| 屏东县| 伊金霍洛旗| 通许县| 洪湖市| 新民市| 高阳县| 武安市| 咸阳市| 东乡县| 平山县| 玛纳斯县| 白沙| 汝南县| 陵水| 正阳县| 建阳市| 元朗区| 金寨县| 永胜县| 石棉县| 贵港市|