1.佈局優化
佈局優化的思想很簡單,就是儘量減少佈局文件的層級。
刪除佈局中無用的控件和層級,其次有選擇的使用性能較低的ViewGroup。FrameLayout和LinearLayout一樣都是一種簡單高效的ViewGroup,可以優先考慮使用。對於需要通過嵌套的方式來實現的界面,建議使用RelativeLayout。
採用include標籤、merge標籤和ViewStub。include標籤主要用於佈局重用,merge標籤一般和include標籤配合使用,它可以降低減少佈局的層級,而ViewStub則提供了按需加載的功能,當需要時纔將ViewStub中的佈局加載到內存,提高了程序的初始化效率。
2.繪製優化
繪製優化是指View的onDraw方法要避免執行大量的操作。
- onDraw不要創建新的局部對象。
- onDraw不要執行耗時操作。
3.內存泄露優化
內存泄露的優化主要在於兩個方面,一方面開發過程中避免寫出有內存泄漏的代碼,另一方面通過一些分析工具(如LeakCanary、MAT)找出潛在的內存泄漏的原因。
- 使用LeakCanary開源控件,可以很好的幫助我們發現內存泄露的情況
注意Activity的泄漏
例如Handler導致的Activity泄漏,爲了解決這個問題,可以在UI退出之前,執行remove Handler消息隊列中的消息與runnable對象。或者是使用Static + WeakReference的方式來達到斷開Handler與Activity之間存在引用關係的目的。考慮使用Application Context而不是Activity Context
- 注意臨時Bitmap對象的及時回收
注意監聽器的註銷
在Android程序裏面存在很多需要register與unregister的監聽器,我們需要確保在合適的時候及時unregister那些監聽器。注意緩存容器中的對象泄漏
- 注意WebView的泄漏
通常根治這個問題的辦法是爲WebView開啓另外一個進程,通過AIDL與主進程進行通信,WebView所在的進程可以根據業務的需要選擇合適的時機進行銷燬,從而達到內存的完整釋放。 - 注意Cursor對象是否及時關閉
4.ListView 和Bitmap優化
針對ListView的優化:
- 採用ViewHolder避免在getView中執行耗時操作
- 根據滑動狀態來控制任務的執行頻率,例如當列表快速滑動時顯然不適合開啓大量的異步任務。
- 可以嘗試開啓硬件加速來使滑動更流暢
針對Bitmap的優化:
主要是通過BitmapFactory.Options來根據需求對圖片進行採樣,採樣過程中主要用到了BitmapFactory.Options的inSampleSize參數。
5.線程優化
採用線程池,避免程序中存在大量的Thread。線程池可以重用內部的線程,從而避免了線程的創建和銷燬帶來的性能開銷;同時線程池還可以有效的控制線程池的最大併發數,避免大量線程因互相搶佔系統資源從而導致阻塞現象的出現。
6.優化建議
- 避免創建過多的對象
- 不要過多使用枚舉,枚舉佔用的內存空間要比整型大
- 常量使用static final來修飾
- 使用一些Android特有的數據結構,比如SpareArray和Pair等,它們具有更好的性能
- 適當使用軟引用和弱引用
- 採用內存緩存和磁盤緩存
- 儘量採用靜態內部類,這樣可以避免潛在的由於內部類導致的內存泄露
- 使用ProGuard來剔除不需要的代碼