Android效能優化之提高ListView效能的技巧
ListView優化一直是一個老生常談的問題,不管是面試還是平常的開發中,ListView永遠不會被忽略掉,那麼這篇文章我們來看看如何最大化的優化ListView的效能。
- 1.在adapter中的getView方法中儘量少使用邏輯
- 2.盡最大可能避免GC
- 3.滑動的時候不載入圖片
- 4.將ListView的scrollingCache和animateCache設定為false
- 5.item的佈局層級越燒越好
- 6.使用ViewHolder
1.在adapter中的getView方法中儘量少使用邏輯
不要在你的getView()中寫過多的邏輯程式碼,我們可以將這些程式碼放在別的地方,例如:
優化前的getView():
@Override
public View getView(int position, View convertView, ViewGroup paramViewGroup) {
Object current_event = mObjects.get(position);
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.row_event, null );
holder.ThreeDimension = (ImageView) convertView.findViewById(R.id.ThreeDim);
holder.EventPoster = (ImageView) convertView.findViewById(R.id.EventPoster);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//在這裡進行邏輯判斷,這是有問題的
if (doesSomeComplexChecking()) {
holder.ThreeDimention.setVisibility(View.VISIBLE);
} else {
holder.ThreeDimention.setVisibility(View.GONE);
}
// 這是設定image的引數,每次getView方法執行時都會執行這段程式碼,這顯然是有問題的
RelativeLayout.LayoutParams imageParams = new RelativeLayout.LayoutParams(measuredwidth, rowHeight);
holder.EventPoster.setLayoutParams(imageParams);
return convertView;
}
優化後的getView():
@Override
public View getView(int position, View convertView, ViewGroup paramViewGroup) {
Object object = mObjects.get(position);
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.row_event, null);
holder.ThreeDimension = (ImageView) convertView.findViewById(R.id.ThreeDim);
holder.EventPoster = (ImageView) convertView.findViewById(R.id.EventPoster);
//設定引數提到這裡,只有第一次的時候會執行,之後會複用
RelativeLayout.LayoutParams imageParams = new RelativeLayout.LayoutParams(measuredwidth, rowHeight);
holder.EventPoster.setLayoutParams(imageParams);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// 我們直接通過物件的getter方法代替剛才那些邏輯判斷,那些邏輯判斷放到別的地方去執行了
holder.ThreeDimension.setVisibility(object.getVisibility());
return convertView;
}
2.GC 垃圾回收器
當你建立了大量的物件的時候,GC就會頻繁的執行,所以在getView()方法中不要建立很多的物件,最好的優化是,不要在ViewHolder以外建立任何物件,如果你的你的log裡面發現“GC has freed some memory”頻繁出現的話,那你的程式肯定有問題了。你可以檢查一下:
a) item佈局的層級是否太深
b) getView()方法中是否有大量物件存在
c) ListView的佈局屬性
3.載入圖片
如果你的ListView中需要顯示從網路上下載的圖片的話,我們不要在ListView滑動的時候載入圖片,那樣會使ListView變得卡頓,所以我們需要再監聽器裡面監聽ListView的狀態,如果滑動的時候,停止載入圖片,如果沒有滑動,則開始載入圖片
listView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView listView, int scrollState) {
//停止載入圖片
if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) {
imageLoader.stopProcessingQueue();
} else {
//開始載入圖片
imageLoader.startProcessingQueue();
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
});
4.將ListView的scrollingCache和animateCache設定為false
scrollingCache: scrollingCache本質上是drawing cache,你可以讓一個View將他自己的drawing儲存在cache中(儲存為一個bitmap),這樣下次再顯示View的時候就不用重畫了,而是從cache中取出。預設情況下drawing cahce是禁用的,因為它太耗記憶體了,但是它確實比重畫來的更加平滑。而在ListView中,scrollingCache是預設開啟的,我們可以手動將它關閉。
animateCache: ListView預設開啟了animateCache,這會消耗大量的記憶體,因此會頻繁呼叫GC,我們可以手動將它關閉掉
優化前的ListView
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:cacheColorHint="#00000000"
android:divider="@color/list_background_color"
android:dividerHeight="0dp"
android:listSelector="#00000000"
android:smoothScrollbar="true"
android:visibility="gone" />
優化後的ListView
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@color/list_background_color"
android:dividerHeight="0dp"
android:listSelector="#00000000"
android:scrollingCache="false"
android:animationCache="false"
android:smoothScrollbar="true"
android:visibility="gone" />
5.減少item的佈局的深度
我們應該儘量減少item佈局深度,因為當滑動ListView的時候,這回直接導致測量與繪製,因此會浪費大量的時間,所以我們應該將一些不必要的佈局巢狀關係去掉。減少item佈局深度
6.使用ViewHolder
這個大家應該非常熟悉了,但是不要小看這個ViewHolder,它可以大大提高我們ListView的效能
ListView的優化我們已經講完了,如果在你的專案中,這些基本優化你還沒有做到的話,那麼你的ListView是有問題的,還有很大的提升潛力,以後再使用ListView的時候,一定要將這幾點考慮進去,發揮它的最大的效能。
相關推薦
Android效能優化之提高ListView效能的技巧
ListView優化一直是一個老生常談的問題,不管是面試還是平常的開發中,ListView永遠不會被忽略掉,那麼這篇文章我們來看看如何最大化的優化ListView的效能。 1.在adapter中的getView方法中儘量少使用邏輯 2.盡最大可能避免GC 3
Android效能優化之apk瘦身技巧
隨著專案迭代,新功能的增加。回導致apk越大。那麼在下載安裝過程中。使用者耗費的流量越多。 安裝等待的時間也會越長。這就意味著下載轉化率會越低。那麼如何apk瘦身呢? 理解APK結構 在討論怎麼減小Apk體積之前,理解一個應用的APK結構是非常有幫助的。一個ap
Android效能優化之Listview(ViewHolder重用機制)
好久沒發部落格了,因為發部落格太耗時間了,而且參考的比較多,也不想一直帶著轉載兩個字。都一直放在筆記裡。不過只能自己看不能和大家分享了,看到這篇文章令我恍然大悟,很有幫助,所以還是決定寫下來。 相信大家在很多時候都會用到ListView這個控制元件,因為確實是用的很多
Android——效能優化之SparseArray
相信大家都用過HashMap用來存放鍵值對,最近在專案中使用HashMap的時候發現,有時候 IDE 會提示我這裡的HashMap可以用SparseArray或者SparseIntArray等等來代替。 SparseArray(稀疏陣列).它是Android內部特有的api,標準的jdk是沒有這
Android效能優化之較精確的獲取影象顯示到螢幕上的時間
轉載自:http://blog.desmondyao.com/android-show-time/ 這兩天我的包工頭歪龍木·靈魂架構師·王半仙·Yrom給我派了一個活:統計App冷啟動時間。這個任務看上去不難,但是要求統計出來的時間要準,要特別準。 意思就是,我必須要按Activity繪製到
Android效能優化之圖片壓縮優化
1 分類Android圖片壓縮結合多種壓縮方式,常用的有尺寸壓縮、質量壓縮、取樣率壓縮以及通過JNI呼叫libjpeg庫來進行壓縮。 參考此方法:Android-BitherCompress 備註:對於資源圖片直接使用:tiny壓縮 2 質量壓縮(1)原理:保持畫素的前提下改變圖片的位深及透明度,(即:通
Android效能優化之佈局優化
佈局優化可以通過減少佈局層級來提高,儘量減少使用效能低的佈局,LineaLayout的效率最高,在可以使用LinearLayout或者RelativeLayout時,選擇LinearLayout。因為RelativeLayout測量較為複雜,需要測量水平和
Android進階——效能優化之程序拉活原理及手段完全解析(二)
引言 上一篇文章Android進階——效能優化之程序保活原理及手段完全解析(一)總結了Android程序和執行緒的相關知識,主要介紹了幾種提升程序優先順序的手段,通常僅僅是提高優先順序只能讓你的程序存活時間久一點,但是真正的被殺死之後就不會自動拉活的,如果你的程
Android應用效能優化之使用SparseArray替代HashMap
原文地址:http://liuzhichao.com/p/832.html HashMap是java裡比較常用的一個集合類,我比較習慣用來快取一些處理後的結果。最近在做一個Android專案,在程式碼中定義這樣一個變數,例項化時,Eclipse卻給出了一個 pe
listview的Adapter效能優化之viewholder終極用法,無需生成holder內部類類
import android.util.SparseArray; import android.view.View; /** * @Description:萬能的viewHolder * 使用方式:在adapter的getview()中使用,且adapter中不需要申明
Android效能優化之實現擁有Looper的執行緒--HandlerThread
1 HandlerThread 1.1 定義 HandlerThread是能夠新建擁有Looper的Thread,這個Looper能夠用來新建其他的Handler。HandlerThread本質是一個執行緒,線上程內部,程式碼是序列處理的。(執行緒中
android專案效能優化之啟動時間
一般來說,判定一個android專案效能優劣,我們有以下幾個指標: 啟動時間 apk大小 UI渲染 穩定性 記憶體佔用 電量消耗 接下來,讓我們就這幾個指標展開來詳述各自究竟應該怎樣去優化。 啟動時間 一般來說,應用啟動時間分為三種 首次啟動
Android 效能優化之String篇
Android 效能優化之 String篇 關於String相關知識都是老掉牙的東西了,但我們經常可能在不經意的String 字串拼接的情況下浪費記憶體,影響效能,也常常會成為觸發記憶體OOM的最後一步。 所以本文對String字串進行深度解析,有
Android進階——效能優化之儘量多使用AsyncTask進行短時間網路通訊
引言 對於我們Android 開發來說,網路操作應該是最普遍不過的操作了吧,因為沒有網路操作的APP應該就沒有存在的價值吧,往往網路操作這部分又通常是耗時的,所以為了良好的使用者體驗,我們必須把耗時操作放到非UI執行緒,而實現方式有很多種,比較常見的應該就是H
Android效能優化之:XML佈局檔案優化
Android中XML佈局檔案的使用非常頻繁,在載入XML佈局的時候,如果對XML檔案其進行優化,將會提高載入的效率。 HierarchyViewer工具 再開始介紹之前先說一下HierarchyViewer工具的使用。 不合理的佈局會使我們的應用程式
Android 效能優化之記憶體洩漏檢測以及記憶體優化(中)
Android 記憶體洩漏檢測 通過上篇部落格我們瞭解了 Android JVM/ART 記憶體的相關知識和洩漏的原因,再來歸類一下記憶體洩漏的源頭,這裡我們簡單將其歸為一下三類:自身編碼引起由專案開發人員自身的編碼造成;第三方程式碼引起這裡的第三
Android 效能優化之記憶體檢測、卡頓優化、耗電優化、APK瘦身
導語 自2008年智慧時代開始,Android作業系統一路高歌,10年智慧機發展之路,如今 Android 9.0 代號P 都發布了,Android系統性能已經非常流暢了。但是,到了各大廠商手裡,改原始碼自定系統,使得Android原生系統變得魚龍混雜。另外,到了不同層次的
Android效能優化之被忽視的Memory Leaks
起因 寫部落格就像講故事,得有起因,經過,結果,人物,地點和時間。今天就容我給大家講一個故事。人物呢,肯定是我了。故事則發生在最近的這兩天,地點在coder君上班的公司。那天無意中我發現了一個奇怪的現象,隨著我點開我們App的頁面,Memory Monitor
Android 效能優化之記憶體洩漏的檢測與修復
在 Android 開發中, 記憶體優化是APP效能優化中很重要的一個部分. 而在記憶體優化中, 最重要的就是修復記憶體洩漏問題. 本文就來介紹一下記憶體洩漏的基本概念以及常用的檢測手段. 1. 什麼是記憶體洩漏 簡單來說, 當一個物件不再被使用時,
Android效能優化之Android安裝包大小優化
隨著應用業務功能的日益複雜,使用的第三方庫和SDK也會日益增加,這樣導致的直接後果就是安裝包的體積日漸增加,除了使用外掛化的手段,減少安裝包的體積,我們還可以從以下幾個方面著手,進行安裝包大小的優化。 程式碼混淆 ProGuard是一個開源的Java程式碼混淆器