国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

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

2016-05-21 16:01李新輝
計(jì)算機(jī)時(shí)代 2016年5期
關(guān)鍵詞:優(yōu)化

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

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

中圖分類號(hào):TP393.09 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):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 引言

在開(kāi)發(fā)Android應(yīng)用時(shí),通常都會(huì)用到Android SDK提供的一個(gè)名為L(zhǎng)istView的組件。ListView能夠以列表行的形式展示數(shù)據(jù),并且能夠根據(jù)數(shù)據(jù)的長(zhǎng)度自適應(yīng)顯示,比如手機(jī)里的通訊錄就是使用ListView來(lái)顯示聯(lián)系人的信息,還有像新聞?lì)惡蜕缃籄PP等也都用到了ListView組件,如圖1所示。相比Button之類的簡(jiǎn)單控件而言,ListView的使用要復(fù)雜一些,而且如果處理不當(dāng)就很容易在程序運(yùn)行時(shí)引起一些性能問(wèn)題,從而給用戶留下不良的印象,因此掌握ListView的正確使用方法顯得很重要。

1 ListView原理分析

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

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

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

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

2.1 重用列表行視圖

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

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

2.2 ViewHolder綁定

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

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

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

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

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

2.4 網(wǎng)絡(luò)數(shù)據(jù)本地緩存

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

3 總結(jié)

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

參考文獻(xiàn)(References):

[1] 李新輝,鄒紹芳.Android移動(dòng)應(yīng)用開(kāi)發(fā)項(xiàng)目教程[M].人民郵電出版社,2014.

[2] 黃宏程,胡敏,陳如松.Android移動(dòng)應(yīng)用設(shè)計(jì)與開(kāi)發(fā)[M].人民郵電出版社,2014.

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

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

[5] 王向輝,張國(guó)印,沈潔.Android應(yīng)用程序開(kāi)發(fā)[M]. 清華大學(xué)出版社,2010.

猜你喜歡
優(yōu)化
超限高層建筑結(jié)構(gòu)設(shè)計(jì)與優(yōu)化思考
一道優(yōu)化題的幾何解法
由“形”啟“數(shù)”優(yōu)化運(yùn)算——以2021年解析幾何高考題為例
基于低碳物流的公路運(yùn)輸優(yōu)化