



下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中怎么提升ListView的性能
Android中怎么提升ListView的性能,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面在下將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。ListView如何運(yùn)作的?ListView是設(shè)計(jì)應(yīng)用于對(duì)可擴(kuò)展性和高性能要求的地方。實(shí)際上,這就意味著ListView有以下2個(gè)要求:盡可能少的創(chuàng)建View;只是繪制和布局在屏幕上可見(jiàn)的子View。理解***點(diǎn)很簡(jiǎn)單:通過(guò)布局xml文件在創(chuàng)建View并顯示是很昂貴耗時(shí)耗資源的操作。盡管布局文件已經(jīng)編譯打包成了二進(jìn)制形式以便于更高效的語(yǔ)法解析,但是創(chuàng)建View仍然需要通過(guò)一個(gè)特殊的XML樹(shù),并實(shí)例化所有需要響應(yīng)的View。ListView通過(guò)回收一些不可見(jiàn)的Views,通常在Android源碼中稱為“ScrapView(廢棄的View)”來(lái)解決這個(gè)問(wèn)題。這及意味著開(kāi)發(fā)者只需要簡(jiǎn)單的更新每行的內(nèi)容而不需要針對(duì)每個(gè)單獨(dú)的行的布局來(lái)創(chuàng)建View。為了實(shí)現(xiàn)第二點(diǎn),在我們滑動(dòng)屏幕時(shí),ListView通過(guò)使用View回收器來(lái)增加低于或者高于當(dāng)當(dāng)前窗口的Views,并當(dāng)前活動(dòng)的Views移動(dòng)到一個(gè)可回收池中。這樣的話,ListView只需要在內(nèi)存中保持足夠多的Views去填充分配空間中的布局和一些額外的可回收Views,即使當(dāng)你的Adapter有上百個(gè)items的適合。它會(huì)使用不同的方法去填充行之間的空間,從頂部或者底部等等,具體取決于窗口是如何變化的。下面這個(gè)圖很直觀的展示了當(dāng)你按下ListView的時(shí)候發(fā)生了什么:通過(guò)上述介紹,相比我們已經(jīng)熟悉了ListView的這種機(jī)制,讓我們繼續(xù)前往技巧部分。正如上述介紹的,在滑動(dòng)時(shí),ListView通過(guò)動(dòng)態(tài)的創(chuàng)建和回收很多View,實(shí)現(xiàn)了盡可能地讓Adapter的getView()輕量。所有的技巧都是通過(guò)多種方法讓getView()更快。View的回收當(dāng)ListView每次需要在屏幕上顯示新的一行的時(shí)候,會(huì)從其Adapter中調(diào)用getView()的方法。眾所周知,getView()方法有3個(gè)參數(shù):行的位置,convertView以及父ViewGroup。參數(shù)convertView說(shuō)穿來(lái)就是之前講述的ScrapView。當(dāng)ListView要求更新一行的布局時(shí),convertView是一個(gè)非空值。因此,當(dāng)convertView值非空時(shí),你僅僅需要更新內(nèi)容即可,而不需要重新一個(gè)新行的布局。getView()在Adapter中一般是如下的形式:public
View
getView(int
position,
View
convertView,
ViewGroup
parent)
{
if
(convertView
==
null)
{
convertView
=
mInflater.inflate(R.layout.your_layout,
null);
}
TextView
text
=
(TextView)
convertView.findViewById(R.id.text);
text.setText("Position
"
+
position);
return
convertView;
}ViewHolder如何寫(xiě)的模板Android很常見(jiàn)的一個(gè)操作就是在布局文件中找到一個(gè)內(nèi)部的View。通常是使用一個(gè)findViewById()的View方法來(lái)實(shí)現(xiàn)的。這個(gè)findViewById()方法在View樹(shù)中,根據(jù)一個(gè)ViewID,會(huì)遞歸的被調(diào)用來(lái)找到其子樹(shù)。雖然在靜態(tài)UI布局中使用findViewById()是完全正常的。但是,在滑動(dòng)時(shí),ListView調(diào)用其Adapter中的getView()是非常頻繁的。findViewById()可能會(huì)影響ListView滑動(dòng)時(shí)的性能,尤其是你的行布局是很復(fù)雜的時(shí)候。尋找一個(gè)充氣布局內(nèi)的內(nèi)部觀點(diǎn)是在Android上最常用的操作之一。這通常是通過(guò)一個(gè)名為findViewById(查看方法完成)。此方法將遞歸經(jīng)過(guò)視圖樹(shù)尋找一個(gè)孩子用給定的ID碼。靜態(tài)的UI布局使用findViewById()是完全正常,但正如你所看到的,ListView中滾動(dòng)時(shí)調(diào)用適配器的getView()非常頻繁。
findViewById()可能perceivably擊中ListViews,尤其是滾動(dòng)的性能,如果你行的布局是不平凡的。ViewHolder的模式就是減少在Adapter中g(shù)etView()方法中調(diào)用findViewById()次數(shù)。實(shí)際上,ViewHolder是一個(gè)輕量級(jí)的內(nèi)部類,用于直接引用到所有內(nèi)部views。在創(chuàng)建View之后,你可以在每行的View存儲(chǔ)為一個(gè)標(biāo)簽。通過(guò)這種方法,只需要在初次創(chuàng)建布局的時(shí)候調(diào)用findViewById()。下面是一個(gè)使用上述方法的ViewHolder模板的代碼示例:public
View
getView(int
position,
View
convertView,
ViewGroup
parent)
{
ViewHolder
holder;
if
(convertView
==
null)
{
convertView
=
mInflater.inflate(R.layout.your_layout,
null);
holder
=
new
ViewHolder();
holder.text
=
(TextView)
convertView.findViewById(R.id.text);
convertView.setTag(holder);
}
else
{
holder
=
convertView.getTag();
}
holder.text.setText("Position
"
+
position);
return
convertView;
}
private
static
class
ViewHolder
{
public
TextView
text;
}異步加載很多時(shí)候,Android應(yīng)用在ListView每行中顯示一些多媒體內(nèi)容,比如圖片等。在Adapter中的getView()使用應(yīng)用內(nèi)置的圖片資源還是不會(huì)出什么問(wèn)題的,因?yàn)榭梢源鎯?chǔ)在Android的高速緩存中。但當(dāng)你想多態(tài)的顯示來(lái)自本地磁盤(pán)或網(wǎng)絡(luò)的內(nèi)容時(shí),例如縮略圖,簡(jiǎn)歷圖片等。在這種情況下,你可能不希望直接在Adapter中的getView()加載它們,因?yàn)镮O進(jìn)程會(huì)阻塞UI線程。如果這樣做的話,ListView就看起來(lái)非??D。在一個(gè)單獨(dú)的線程,如果想要運(yùn)行的所有行的IO操作或任何高負(fù)載CPU限制的異步操作。其中的技巧就是要做到符合ListView的回收行為。例如,如果在Adapter中的getView()中,使用AsyncTask的加載去加載資料圖片,在AsyncTask完成之前,你正在加載的圖片View就有可能被回收用于其他地方。所以,一旦異步操作完成的同時(shí),需要一種機(jī)制來(lái)知道如果相應(yīng)的View有沒(méi)有被回收。一個(gè)簡(jiǎn)單的方法來(lái)實(shí)現(xiàn)這一目標(biāo)是通過(guò)附加一些標(biāo)識(shí)該行與它相關(guān)的View的信息。然后,當(dāng)異步操作完成的適合,檢查目標(biāo)行的View和標(biāo)識(shí)的View是否一致。實(shí)現(xiàn)這一目標(biāo)的方法很多。下面是實(shí)現(xiàn)這種方法的一個(gè)很簡(jiǎn)單的示例:public
View
getView(int
position,
View
convertView,
ViewGroup
parent)
{
ViewHolder
holder;
...
holder.position
=
position;
new
ThumbnailTask(position,
holder)
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
null);
return
convertView;
}
private
static
class
ThumbnailTask
extends
AsyncTask
{
private
int
mPosition;
private
ViewHolder
mHolder;
public
ThumbnailTask(int
position,
ViewHolder
holder)
{
mPosition
=
position;
mHolder
=
holder;
}
@Override
protected
Cursor
doInBackground(Void...
arg0)
{
//
Download
bitmap
here
}
@Override
protected
void
onPostExecute(Bitmap
bitmap)
{
if
(mHolder.position
==
mPosition)
{
mHolder.thumbnail.setImageBitmap(bitmap);
}
}
}
private
static
class
ViewHolder
{
public
ImageView
thumbnail;
public
int
position;
}人機(jī)交互知識(shí)做到在每一行異步加載很多資源,是一個(gè)高性能的ListView的必經(jīng)之路。但是,在滑動(dòng)屏幕時(shí),如果你一味的在每一個(gè)getView()調(diào)用里面都去啟動(dòng)一個(gè)異步的操作,造成的結(jié)果就是你會(huì)浪費(fèi)大量資源。因?yàn)樾斜活l繁回收,造成大部分返回的結(jié)果會(huì)被丟棄??紤]到實(shí)際的人機(jī)交互情況,在ListView適配器中,在每一行中都不應(yīng)該去觸發(fā)任何異步操作。也就是說(shuō),在ListView中有flin
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)業(yè)人工勞務(wù)合同范本
- 商鋪代管經(jīng)營(yíng)合同范本
- 北京建委抵押合同范本
- 倉(cāng)庫(kù)托管運(yùn)輸合同范本
- 修理物品維修合同范本
- 傭金確認(rèn)中介合同范本
- 判決協(xié)商合同范本
- 租樹(shù)合同范本
- 辦公茶臺(tái)轉(zhuǎn)讓合同范本
- 口腔機(jī)器采購(gòu)合同范本
- 農(nóng)村土地承包調(diào)解仲裁與仲裁庭審技巧課件
- 介入放射學(xué)全套教程
- 人教版政治七年級(jí)下冊(cè)全套課件
- 外研版小學(xué)英語(yǔ)五年級(jí)下冊(cè)課文翻譯
- 口語(yǔ)教程4整套課件完整版教學(xué)教程最全電子講義教案
- 高壓氧艙課件
- 加德納多元智能測(cè)評(píng)量表【復(fù)制】
- 譯林英語(yǔ)四年級(jí)下冊(cè)4B各單元教學(xué)反思
- 國(guó)家電網(wǎng)有限公司十八項(xiàng)電網(wǎng)重大反事故措施(修訂版)
- 環(huán)氧乙烷固定床反應(yīng)器課程設(shè)計(jì)
- 班、團(tuán)、隊(duì)一體化建設(shè)實(shí)施方案
評(píng)論
0/150
提交評(píng)論