android 的listview的優化

2021-08-27 09:13:24 字數 2990 閱讀 2790

首先定義listview

首先是把這個listview顯示出來,在activity中兩個步驟:

1:找到listview對應的布局 *** = (強轉)findviewbyid(對應id)

2:設定介面卡:

***.setadapt(這裡放介面卡);

3:新建介面卡:

new myadapt(這裡可以選擇實現adapter的介面,也可以選擇繼承baseadapter,區別在於baseadapt已經輔助實現了一些虛函式,所以我們不需要再去寫那麼多方法,使**看起來比較混亂)

public class mylistadapter extends baseadapter

public object getitem(int position)

public long getitemid(int position)

public view getview(int position, view convertview, viewgroup parent)

}4:到這裡乙個listview已經建立完成了。

如果就這樣使用這個listview的話,我們可能會遇到的問題

1:如果資料量很龐大,那麼開啟那個activity的時候會出現乙個白屏(如果這樣的話,使用者體驗可謂糟糕之極呀)。

2:在滾動listview的時候會發現有一點卡,操作起來不流暢。

3:記憶體消耗很大,占用資源很多。

我逐個的說下優化方案:

對於第一點:出現的那個白屏,是由於在顯示前做了乙個比較耗時的操作,例如做了大量的資料查詢或者操作。

解決方案1:就是將耗時操作放到執行緒中去做,這樣耗時就不會造成螢幕卡住,而我們也可以用一些個比較美觀的進度條來提示使用者,我們目前正在進行的操作,這樣使用者應該就能比較舒服,不會認為你這個程式有毛病,而放棄這個程式。

解決方案2:就是將耗時操作分片。當然也建議放到執行緒中,其次,我們將一次性需要耗時很多的操作並不一次性做完,而是分次去做。形象的說:如果我們的**本中有1000個號碼,我們不需要去全部找出來,而是首先找出10條左右,正好顯示一頁,這樣時間會很短,當我們去拖動這個listview的時候,我們再去載入其他的選項,表現在資料庫上就是分頁的查詢了。

這樣一優化,我想這個listview不單單是不會出現開啟那個activity的時候卡住,而且很快,記憶體的消耗也降低了很多,原來需要將1000條資料全部載入到listview中,現在只需要載入幾十條,那記憶體節省的肯定不是一點點吧??

對於第二點:listview拖動的時候卡,要解決這個問題首先我們要清楚原因:原因是1:我們由下向上拖動listview的時候,android系統會自動的去銷毀我們看不到的部分,並且建立進入我們視野的部分,所以上面的item會不停的被銷毀,而進入視窗的activity會不停的被建立。而建立乙個item會消耗大量的資源,所以導致卡。

解決方案:重複利用已經建好的item。這個思想是和執行緒池和連線池的思路是一樣一樣的。我們如果能看到的item的個數是9個,那麼我們就建立10個這樣的item,當我們乙個item消失的時候,我們不是去銷毀這個物件,而是把這個物件給我們即將進入視野的這個item去使用。這樣就可以重複的利用這個item,就不需要重複的去建立item了,還會卡嗎??

對於第三點,我想,第一點和第二點解決以後,第三點就迎刃而解了。

關於非同步處理耗時操作,這裡要稍微補充一點:

非同步操作時,如果我們的程式去訪問了那些還沒有操作完成的資源,就容易空指標異常。所以我們的解決辦法是:

使用handler,當我們操作完成的時候,給handler傳送乙個訊息,讓它執行下一步操作。(例如我們在查詢資料庫,查詢還沒有完成,然後adapter就去拿資料了,難免會有空指標異常)

當然,我們可以使用android的非同步任務,說到非同步任務,這裡展開一下下:

定義乙個我們自己的非同步任務吧,嘿嘿:

首先寫乙個虛類

public abstract class myasynctask

};/***

* 後台任務執行之前,提示使用者的介面操作

*/public abstract void onpreexecute();

/***

* 後台任務執行之後,提示更新介面的操作

*/public abstract void onpostexecute();

/***

* 在後台執行乙個耗時的操作

*/public abstract void dninbackground();

public void execute()

}.start();}}

然後在我們需要使用非同步的時候在主線程中定義有乙個myasynctask,然後分別填充著幾個虛函式就可以了。

當然也可以使用系統自帶的非同步任務類asynctask,它也定義了那幾個方法,不過封裝的更全面一點了哦,好了,說到這我覺得已經很清楚了,自己嘗試下哦,親。

關於優化listview

我們可以先看下介面卡中的getview方法

public view getview(int position, view convertview, viewgroup parent)

它的作用是把我們需要顯示的view準備好

在裡面新增一句列印操作的時候,我們會發現,每次出現的時候都會去呼叫,很消耗資源。

怎麼優化呢,那我們來看下getview 的幾個引數

view convertview,歷史快取的view物件 當介面有乙個item被移除的時候會有資料,就是需要銷毀的item

將這句**做如下優化

r.layout.list_blacknumber_item, null);

:view view;

if(convertview!=null && convertview instanceof linearlayout)

else

這裡我們當有了這個view的時候就不去銷毀,直接去使用這個執行緒的,不需要去不停的建立和銷毀,效率是不是高了很多了哦??

相信可以明顯的感覺到的。

另外,如果我們的findviewbyid的時候,這個id有很多層,找find的時候很耗時的話也可以對它進行優化

至於資料庫的分頁查詢就不說了哦

RecyclerView和ListView的區別

1 recyclerview可以完成listview,gridview的效果,還可以完成瀑布流的效果。同時還可以設定列表的滾動方向 垂直或者水平 2 recyclerview中view的復用不需要開發者自己寫 系統已經幫封裝完成了。3 recyclerview可以進行區域性重新整理。4 recycl...

Android之推薦看的Android原始碼

handler message looper handler被稱為 非同步提交器 是android開發入門教程必定談及的東西,這也是activity等元件的工作機制需要用到的東西,是 資料驅動 框架的重要組成,作為閱讀原始碼的入門最適合不過。activity和service 作為經常使用到的元件,閱...

Android的MediaRecorder錄影模糊

原來的寫法 next codes is right for 2.3 and 4.0 mmediarecorder new mediarecorder mmediarecorder.setvideosource mediarecorder.videosource.default 設定音訊源 mmedi...