Android效能優化常用方法
本篇部落格主要介紹關於效能優化的一些方法,以及效能分析工具的使用。
一 效能優化的常用方法
主要內容包括佈局優化,繪製優化,記憶體洩露優化,相應速度優化,ListView優化,Bitmap優化,執行緒優化,以及一些效能優化建議,在介紹相應速度優化的同時,還介紹了ANR的日誌分析方法。
(1).佈局優化
佈局優化的思想很簡單,就是儘量減少佈局檔案的層級。
如何進行優化呢?首先刪除佈局中無用的控制元件和層級,其次有選擇地使用效能較低的ViewGroup,比如LinearLayout。如果佈局中有的佈局既可以用LinearLayout也可以用RelativeLayout,那就用LinearLayout,
佈局優化的另一種手段是採用<include>標槍,<merge>標籤和ViewStub。<include>標籤主要用於佈局重用,
(2).繪製方法
繪製優化是指View的onDraw方法避免執行大量的操作,這主要有兩方面。
首先,onDraw中不要建立新的佈局物件,這是因為onDraw方法可能會被頻繁呼叫,這樣就會在一瞬間產生大量的臨時物件,這不僅佔用了過多的記憶體而且還會導致系統更加頻繁的gc,降低了程式的執行效率。
另一方面,onDraw方法中不要做耗時的任務,也不能執行成千上萬次迴圈操作,儘管每次迴圈都很輕量級,但是大量的迴圈仍然十分搶佔
(3).記憶體洩露優化
記憶體洩露在開發過程中是一個需要重視的問題,但是由於記憶體洩露問題對開發人員的經驗和開發意識要求比較高,因此這是開發人員最容易犯的錯誤之一。記憶體洩露的優化分為兩個方面,一方面是在開發過程中避免寫出記憶體洩露的程式碼,另一方面通過一些分析工具比如MAT來找出潛在的記憶體洩露繼而解決。
常見的記憶體洩露舉例:
1.靜態變數導致記憶體洩露
如果我們將activity的context物件賦值給activity的全域性的靜態變數。那麼就會造成activity無法正常銷燬,因為靜態變數在引用它。
2.單例模式導致的記憶體洩漏
如果我們再單例模式中實現了觀察者模式,監聽實現了介面的物件,當我們在Activity中註冊了監聽方法以後,而沒有進行解註冊,就會引起記憶體洩漏。
3.屬性動畫導致的記憶體洩露
屬性動畫中有一類無限迴圈的動畫,如果在Activity中播放此類動畫而沒有在onDestory中停止動畫,那麼動畫會一直播放下去,儘管無法在介面上看到動畫效果了,而且這個時候,Activity的View會被動畫持有,而View有持有了Activity,最終導致Activity無法釋放。
(4).響應速度優化和ANR日誌分析
相應速度優化的核心是避免在主執行緒中做耗時操作,但是有時候的確有很多耗時操作怎麼辦?可以將這些好事操作放線上程中去執行,即採用一部的方式去執行。相應速度過慢地體現在Activity的啟動畫面上,如果在主執行緒中做太多的事情,會導致Activity啟動時出現黑屏的現象,甚至出現ANR。當發生了ANR以後。系統會在/data/anr目錄建立一個檔案traces.txt,通過分析這個檔案,就可以定位ANR的原因。
(5).ListView和Bitmap優化
ListView的優化很簡單,主要分為三個方面:首先採用ViewHolder並避免在getView中執行耗時操作;其次要根據列表的滑動狀態來控制任務的執行頻率,比如當列表快速滑動時顯然是不太適合開啟大量的一部任務;最後,可以嘗試開啟硬體加速來使ListView的滑動更加流暢。
Bitmap優化同樣比較簡單,主要通過BitMapFactory.Options來根據需要對圖片進行取樣,取樣過程主要用到了BitmapFactory.Options的inSampleSize引數。
(6). 執行緒優化
執行緒優化的思想是採用執行緒池,避免程式中存在大量的Thread。執行緒池可以重用內部的執行緒,從而避免了執行緒的建立和銷燬所帶來的效能開銷。同時執行緒池還能有效的控制執行緒池的最大併發數,避免大量的執行緒互相搶佔系統資源從而導致阻塞現象發生。
(7).關於效能優化的建議
1.避免黃健過多物件;
2.不要過多使用列舉,列舉佔用的記憶體空間比整型大一些。
3.常量使用static final 來修飾。
4.使用一些Android特有的資料結構,比如SpareArray和Pair等,他們都具有更好的效能。
5.適當使用軟引用和弱引用。
6.採用記憶體快取和磁碟快取
7.儘量採用靜態內部類,這樣可以避免潛在的內部類而導致的記憶體洩漏。
二 記憶體洩露分析之MAT工具
MAT的全稱是Eclipse Memory Analyzer,它是一款強大的記憶體洩漏分析工具,關於這部分,我不詳述了,請自行查詢相關文章。
寫了十多篇部落格了,以後還該寫什麼,怎麼寫,還在考慮,更新進度可能會慢一些。。。