1. 程式人生 > >Android效能優化常用方法

Android效能優化常用方法

本篇部落格主要介紹關於效能優化的一些方法,以及效能分析工具的使用。

一 效能優化的常用方法

主要內容包括佈局優化,繪製優化,記憶體洩露優化,相應速度優化,ListView優化,Bitmap優化,執行緒優化,以及一些效能優化建議,在介紹相應速度優化的同時,還介紹了ANR的日誌分析方法。

(1).佈局優化

佈局優化的思想很簡單,就是儘量減少佈局檔案的層級。

如何進行優化呢?首先刪除佈局中無用的控制元件和層級,其次有選擇地使用效能較低的ViewGroup,比如LinearLayout。如果佈局中有的佈局既可以用LinearLayout也可以用RelativeLayout,那就用LinearLayout,

這是因為RelativeLayout比較複雜,他的佈局過程花費更多的CPU時間。FrameLayoutLinearLayout一樣都是一種簡單高效的ViewGroup,因此可以考慮使用他們,但是很多時候,單純的通過一個LinearLayout或者FrameLayout無法實現產品的效果,需要通過巢狀的方式來完成,這種情況建議採用RelativeLayout,因為ViewGroup的巢狀就相當於增加了佈局的層級,同樣會降低程式的效能。

 佈局優化的另一種手段是採用<include>標槍,<merge>標籤和ViewStub<include>標籤主要用於佈局重用,

<merge>標籤一般和<include>配合使用,它可以減少佈局的層級。而ViewStub則提供了按需載入功能,當需要時才將ViewStub中的佈局載入到記憶體,這提高了程式的初始化效率。

(2).繪製方法

繪製優化是指ViewonDraw方法避免執行大量的操作,這主要有兩方面。

首先,onDraw中不要建立新的佈局物件,這是因為onDraw方法可能會被頻繁呼叫,這樣就會在一瞬間產生大量的臨時物件,這不僅佔用了過多的記憶體而且還會導致系統更加頻繁的gc,降低了程式的執行效率。

另一方面,onDraw方法中不要做耗時的任務,也不能執行成千上萬次迴圈操作,儘管每次迴圈都很輕量級,但是大量的迴圈仍然十分搶佔

CPU的時間片,這會造成View的繪製過程不流暢。

(3).記憶體洩露優化

記憶體洩露在開發過程中是一個需要重視的問題,但是由於記憶體洩露問題對開發人員的經驗和開發意識要求比較高,因此這是開發人員最容易犯的錯誤之一。記憶體洩露的優化分為兩個方面,一方面是在開發過程中避免寫出記憶體洩露的程式碼,另一方面通過一些分析工具比如MAT來找出潛在的記憶體洩露繼而解決。

常見的記憶體洩露舉例:

1.靜態變數導致記憶體洩露

如果我們將activitycontext物件賦值給activity的全域性的靜態變數。那麼就會造成activity無法正常銷燬,因為靜態變數在引用它。

2.單例模式導致的記憶體洩漏

如果我們再單例模式中實現了觀察者模式,監聽實現了介面的物件,當我們在Activity中註冊了監聽方法以後,而沒有進行解註冊,就會引起記憶體洩漏。

3.屬性動畫導致的記憶體洩露

屬性動畫中有一類無限迴圈的動畫,如果在Activity中播放此類動畫而沒有在onDestory中停止動畫,那麼動畫會一直播放下去,儘管無法在介面上看到動畫效果了,而且這個時候,ActivityView會被動畫持有,而View有持有了Activity,最終導致Activity無法釋放。

(4).響應速度優化和ANR日誌分析

相應速度優化的核心是避免在主執行緒中做耗時操作,但是有時候的確有很多耗時操作怎麼辦?可以將這些好事操作放線上程中去執行,即採用一部的方式去執行。相應速度過慢地體現在Activity的啟動畫面上,如果在主執行緒中做太多的事情,會導致Activity啟動時出現黑屏的現象,甚至出現ANR。當發生了ANR以後。系統會在/data/anr目錄建立一個檔案traces.txt,通過分析這個檔案,就可以定位ANR的原因。

(5).ListViewBitmap優化

ListView的優化很簡單,主要分為三個方面:首先採用ViewHolder並避免在getView中執行耗時操作;其次要根據列表的滑動狀態來控制任務的執行頻率,比如當列表快速滑動時顯然是不太適合開啟大量的一部任務;最後,可以嘗試開啟硬體加速來使ListView的滑動更加流暢。

Bitmap優化同樣比較簡單,主要通過BitMapFactory.Options來根據需要對圖片進行取樣,取樣過程主要用到了BitmapFactory.OptionsinSampleSize引數。

(6). 執行緒優化

執行緒優化的思想是採用執行緒池,避免程式中存在大量的Thread。執行緒池可以重用內部的執行緒,從而避免了執行緒的建立和銷燬所帶來的效能開銷。同時執行緒池還能有效的控制執行緒池的最大併發數,避免大量的執行緒互相搶佔系統資源從而導致阻塞現象發生。

(7).關於效能優化的建議

1.避免黃健過多物件;

2.不要過多使用列舉,列舉佔用的記憶體空間比整型大一些。

3.常量使用static final 來修飾。

4.使用一些Android特有的資料結構,比如SpareArrayPair等,他們都具有更好的效能。

5.適當使用軟引用和弱引用。

6.採用記憶體快取和磁碟快取

7.儘量採用靜態內部類,這樣可以避免潛在的內部類而導致的記憶體洩漏。

二 記憶體洩露分析之MAT工具

MAT的全稱是Eclipse Memory Analyzer,它是一款強大的記憶體洩漏分析工具,關於這部分,我不詳述了,請自行查詢相關文章。

寫了十多篇部落格了,以後還該寫什麼,怎麼寫,還在考慮,更新進度可能會慢一些。。。