標籤:cal ondraw 帶來 bitmap 記憶體佔用 效率 clu 現象 family
這次分析方向,我們主要包括:布局最佳化、繪製最佳化、記憶體流失最佳化、響應速度最佳化、ListView最佳化、Bitmap最佳化、線程最佳化。
布局最佳化:盡量的減少布局的層級,這意味著Android繪製時的工作量會變少。
標籤:<include>的使用只支援Android:layout的開頭屬性
<merge> 可以去除多餘的那一層LinearLayout
ViewStub 繼承了View,本身不參與任何的布局和繪製過程,其意義在於按需載入所需的布局檔案,還不能支援<merge>標籤。
繪製最佳化:指的是View的onDraw方法要避免執行大量的操作;
1)onDraw中不要建立新的布局對象,這是因為onDraw方法可能會被頻繁調用,會一瞬間產生大量的臨時對象,佔用過多的記憶體導致系統更加頻繁gc,降低程式的執行效率。
2)onDraw不要做耗時的任務,過多的迴圈操作會搶佔CPU的時間片,這樣造成View的繪製過程不流暢。官方標準View的繪製幀率保證60fps是最佳。我們需要盡量降低onDraw方法的複雜度。
記憶體流失最佳化:記憶體流失並不會導致程式功能異常,但是會導致Android程式的記憶體佔用過大,會提高記憶體溢出的發生幾率。記憶體流失分析工具MAT。我們需要盡量規避潛在的記憶體流失。會存在情境:1.靜態變數導致的記憶體流失;2.單例模式導致的記憶體流失;3.屬性動畫導致的記憶體流失;具體以後詳解
響應速度最佳化:核心就是避免在主線程中做耗時的操作,採用非同步方式執行耗時操作。如果主線程做太多的耗時事情,會導致Activity啟動黑屏現象。會導致出現ANR,出現之後不要著急,通過分析traces檔案即可定位。
ListView和Bitmap最佳化:
ListView的最佳化無非在於
1)採用ViewHolder並且避免在getView中執行耗時操作;
2)根據列表的滑動狀態來控制任務的執行頻率;
3)嘗試開啟硬體加速來是ListView的滑動更加的流暢;
Bitmap最佳化之前已經說到過了,主要圖片的採樣,BitmapFactory.Options的inSampleSize參數。
線程最佳化:最重要的思想就是採用線程池,避免程式中存在的大量Thread。線程池可以重用內部的線程,從而避免了線程的建立和銷毀所帶來的效能開銷,同時線程池還能有效地控制線程池的最大並發數,避免大量的縣因為互相搶佔系統資源從而導致阻塞現象的發生。
其他最佳化建議:1)避免建立過多的對象;2)不要過多的使用枚舉,其佔有的記憶體空間要比整形大;3)常量使用static final來修飾;4)適當使用軟引用和弱引用;5)採用記憶體緩衝與磁碟緩衝;6)盡量使用靜態內部類;7)使用一些Android特有的資料結構。
Android藝術——效能最佳化問題