亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

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

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

        1 ListView原理分析

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

        ListView顯示列表元素需三方面配合,包括:展示數(shù)據(jù)的視圖(View)、適配器(Adapter)以及具體數(shù)據(jù)(Data)。ListView并不直接獲取數(shù)據(jù)進(jìn)行展示,而是間接通過“適配器”來得到具體要展示的數(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)生比較常見的“卡頓”現(xiàn)象。因此,合理地使用它可以極大改善應(yīng)用程序的性能,帶來更佳的用戶體驗(yàn)。以下從四個(gè)方面考慮ListView的具體優(yōu)化方法。

        2.1 重用列表行視圖

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

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

        2.2 ViewHolder綁定

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

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

        在通過網(wǎng)絡(luò)獲取的數(shù)據(jù)量不大的情況下,或者數(shù)據(jù)本身存在于設(shè)備上,ListView的性能一般不會(huì)成為重點(diǎ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()方法,以便開發(fā)者根據(jù)當(dāng)前ListView的狀態(tài)來決定做何種處理,包括空閑(IDLE)、普通滑動(dòng)(SCROLL)、快速滾動(dòng)(FLING)等三種:

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

        3 總結(jié)

        本文介紹了Android應(yīng)用開發(fā)中最常用的ListView組件的基本工作原理,闡述了ListView組件在開發(fā)中的四種優(yōu)化方法。有關(guān)ListView性能的兩個(gè)因素是,在適配器的getView()方法中不要執(zhí)行耗時(shí)的任務(wù),也不要改行布局的尺寸。如果確需執(zhí)行耗時(shí)操作,可借助線程或線程池的方式進(jìn)行異步任務(wù)處理,或者采取預(yù)加載機(jī)制。盡管ListView的使用比較簡單,但也存在局限性,比如修改數(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)用開發(fā)項(xiàng)目教程[M].人民郵電出版社,2014.

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

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

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

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

        猜你喜歡
        優(yōu)化
        超限高層建筑結(jié)構(gòu)設(shè)計(jì)與優(yōu)化思考
        民用建筑防煙排煙設(shè)計(jì)優(yōu)化探討
        關(guān)于優(yōu)化消防安全告知承諾的一些思考
        一道優(yōu)化題的幾何解法
        由“形”啟“數(shù)”優(yōu)化運(yùn)算——以2021年解析幾何高考題為例
        基于低碳物流的公路運(yùn)輸優(yōu)化
        色婷婷日日躁夜夜躁| 国产无套内射又大又猛又粗又爽 | 国产精品一区二区三区蜜臀| 日本一区二区三区四区啪啪啪| 精品精品国产自在97香蕉| 日日碰狠狠躁久久躁96avv| 亚洲AV无码一区二区一二区色戒| 丝袜美腿一区在线观看| 色欲欲www成人网站| 成熟人妻av无码专区| 中国女人a毛片免费全部播放 | 亚洲熟妇av日韩熟妇av| 日本乱熟人妻中文字幕乱码69| 亚洲高清乱码午夜电影网| 国产在线精品一区二区不卡| 国产乱人伦AⅤ在线麻豆A| 五月婷婷开心六月激情| 一区二区三区中文字幕| 人妻在卧室被老板疯狂进入国产| 中文字幕一区,二区,三区| 国产自拍在线观看视频| 一区二区三区乱码在线 | 欧洲| 国产亚洲欧美成人久久片| 中文字幕国产精品专区| 国产亚洲aⅴ在线电影| 无遮无挡爽爽免费视频| 爆乳日韩尤物无码一区| 日本免费看片一区二区三区| 亚洲av永久无码精品网站在线观看 | 国产毛片视频一区二区| 中文字幕在线播放| 老熟女熟妇嗷嗷叫91| 国产三级国产精品国产专播| 亚洲日韩欧美一区、二区| 欧美日韩成人在线| 国产成人高清精品亚洲一区| 久久久国产精品无码免费专区| 热re99久久精品国产99热| 男女高潮免费观看无遮挡| 亚洲网站一区在线播放| 99久久国产综合精品五月天|