胡暢霞 陳娜 劉曉星
摘要:圖片作為Android應(yīng)用中重要的資源信息,保證圖片資源的流暢顯示對用戶人機(jī)交互體驗的提升至關(guān)重要。該文作者以在ListView控件中加載圖片資源為例,首先簡述以傳統(tǒng)加載圖片的方式,隨后給出兩種優(yōu)化方案:1)Adapter優(yōu)化;2)引用Android Image Loader 框架。通過優(yōu)化達(dá)到流暢加載圖片資源的效果,增強用戶體驗。
關(guān)鍵詞:圖片加載優(yōu)化;Adapter優(yōu)化; Android Image Loader框架
中圖分類號:TP311? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2021)25-0078-02
1引言
圖片資源作為Android應(yīng)用中不可或缺的資源,豐富著信息內(nèi)容,使用戶更加容易理解界面?zhèn)鬟_(dá)的信息。在實際開發(fā)中,因為程序需要經(jīng)常連接網(wǎng)絡(luò),且界面上存在著豐富的圖片資源,所以加載圖片時系統(tǒng)資源的消耗是巨大的。ListView控件作為Android中最常見的控件,因此需要加載網(wǎng)絡(luò)上的圖片資源時就經(jīng)常需要用到ListView控件。為了使人機(jī)交互友好,就要保證圖片加載要得到快速的響應(yīng),盡量避免加載超時或者延時等現(xiàn)象。本文作者以在ListView控件中加載網(wǎng)絡(luò)圖片資源為例,淺析在Android開發(fā)中對圖片優(yōu)化的如下幾種方法。
2傳統(tǒng)方式加載圖片資源
利用傳統(tǒng)方式在ListView中加載圖片資源,首先創(chuàng)建URL對象傳入網(wǎng)絡(luò)圖片的網(wǎng)址,網(wǎng)址必須是絕對路徑,得到圖片的數(shù)據(jù)流。在Android中,提供了BitmapFactory類,用于從不同的數(shù)據(jù)源來解析、創(chuàng)建Bitmap對象。Bitmap對象在如TextView 控件中顯示,最后關(guān)閉數(shù)據(jù)流。
示例代碼:
Bitmap bitmap = null;
URL url;
try {
url = new URL(“視頻網(wǎng)址”);
InputStreamiliu = url.openStream();
bitmap = BitmapFactory.decodeStream(iliu);
iliu.close();}
catch (Exception e) {e.printStackTrace();}
傳統(tǒng)方式簡單、直接、書寫簡單,但在UI主線程中執(zhí)行聯(lián)網(wǎng)耗時操作,不但導(dǎo)致圖片資源加載速度慢,而且影響其他項的響應(yīng)速度。
3利用Adapter優(yōu)化的方式,加載圖片資源
在使用ListView 控件加載圖片資源時,Android引入Adapter機(jī)制作為復(fù)雜數(shù)據(jù)的展示和轉(zhuǎn)化的載體,Adapter作為ListView控件與數(shù)據(jù)源之間的“中介”,當(dāng)每條數(shù)據(jù)進(jìn)入到可見區(qū)時,Android會調(diào)用Adapter中的getView()方法來返回代表著具體數(shù)據(jù)的視圖,由于數(shù)據(jù)成千上萬,所以getView()方法被多次調(diào)用,因此通過減少getView()方法的調(diào)用次數(shù)來優(yōu)化Adapter會提高加載圖片資源的加載速度。
3.1 利用ViewHolder模式優(yōu)化Adapter
ViewHolder類是Android定義的一個靜態(tài)類,并不是在Android API中提供的方法。ViewHolder模式的存在,可以大大降低多余的findViewById()方法的調(diào)用,而是把使用控件的代碼放在ViewHolder類里面,然后把View.setTag(holder)放在view中,這樣再次使用時就可以直接調(diào)用。
利用ViewHolder模式優(yōu)化Adapter,重復(fù)利用convertView回收視圖,減少getView()的調(diào)用次數(shù)達(dá)到優(yōu)化的效果。這種模式加載圖片資源的操作還是在UI主線程中執(zhí)行,在圖片資源數(shù)目少時,這種方法會有一定的效果,但是圖片資源量大時,依舊會阻塞UI主線程,導(dǎo)致程序的響應(yīng)慢等現(xiàn)象,治標(biāo)不治本。
3.2 利用工作線程加載數(shù)據(jù)
由于加載網(wǎng)絡(luò)圖片資源,既涉及聯(lián)網(wǎng)操作,又包含著大量的數(shù)據(jù)信息,因此我們需要為此操作重新開辟一個新的線程來減輕UI主線程的負(fù)擔(dān)。本文作者在Adapter中使用到的是輕量級AsyncTask工作線程處理方式:當(dāng)程序需要啟動后臺線程來加載圖片資源時,使用該工作線程可以很容易做到,同時在UI線程中也能得到自動返回過來的結(jié)果。需要注意的是,使用AsyncTask時有如下幾點事項需要考慮:
1)創(chuàng)建AsyncTask實例的位置:須在主線程中;
2)調(diào)用AsyncTask的execute()方法的位置:須在主線程中;
3)AsyncTask類中的方法,如onPreExecute、onPostExecute、doInBackground和onProgressUpdate等,它們是由Android系統(tǒng)親自調(diào)用,程序員是不能寫代碼去調(diào)用的;
4)AsyncTask不能被多次調(diào)用,否則會拋出異常,所以只能被執(zhí)行一次。
主要代碼如下:
class MyPictTaskextends AsyncTask {
WeakReferenceimgViewRef;
intshuliang = 0; public BitmapWorkerTask(ImageViewmyimageView) {
imgViewRef= new WeakReference(myimageView);? ? ?}
protected Bitmap doInBackground(Integer...params) {