Android性能優化

前言

Q:爲什麼要進行性能優化?

Android作爲移動平臺,不管是內存或者cpu的性能都受到了一定的限制?過多的使用內存會導致OOM,過多的使用cpu資源,一般指做大量的耗時任務,將會是設備變得卡頓甚至出現ANR(應用程序無響應)異常。

優化的方式

I. 佈局優化

佈局優化的思想:儘量減少佈局的層級,減少繪製界面時的工作量。具體如何做:
方式一:
①去除一些無用的佈局,View;
②有選擇性的使用佈局:比如能使用RelativeLayout也可以使用使用LinearLayout的地方使用後者,儘量少使用性能低的ViewGroup;
③減少層級優先級高於對ViewGroup性能的考慮。

方式二:使用<include><merge>標籤和<ViewStub><include>標籤用於佈局重用,<merge>標籤一般和<include>標籤配合使用,它可以減少佈局的層級,而<ViewStub>提供了按需加載的功能,當需要使用時再加載佈局到內存,這可以提高應用程序的初始化效率。但ViewStub也不是萬能的,下面總結下ViewStub能做的事兒和什麼時候該用ViewStub,什麼時候該用View可見性的控制。

首先來說說ViewStub的一些特點:

1、ViewStub只能Inflate一次,之後ViewStub對象會被置爲空。按句話說,某個被ViewStub指定的佈局被Inflate後,就不會夠再通過ViewStub來控制它了。
2、ViewStub只能用來Inflate一個佈局文件,而不是某個具體的View,當然也可以把View寫在某個佈局文件中。

基於以上的特點,那麼可以考慮使用ViewStub的情況有:

1、在程序的運行期間,某個佈局在Inflate後,就不會有變化,除非重新啓動。

因爲ViewStub只能Inflate一次,之後會被置空,所以無法指望後面接着使用ViewStub來控制佈局。所以當需要在運行時不止一次的顯示和隱藏某個佈局,那麼ViewStub是做不到的。這時就只能使用View的可見性來控制了。

2、想要控制顯示與隱藏的是一個佈局文件,而非某個View。
因爲設置給ViewStub的只能是某個佈局文件的Id,所以無法讓它來控制某個View。
所以,如果想要控制某個View(如Button或TextView)的顯示與隱藏,或者想要在運行時不斷的顯示與隱藏某個佈局或View,只能使用View的可見性來控制。

II.繪製優化

繪製優化指的是避免在View的onDraw方法中執行大量的操作。主要體現在兩個方面:

①在onDraw方法中不要創建新的對象,因爲onDraw方法會頻繁調用,這會產生 大量的臨時對象,不僅佔用內存高而且可能導致頻繁的gc而影響程序的執行效率。
②避免在onDraw方法中執行耗時操作或者成千上萬的循環操作,大量的循環會搶佔cpu時間片,這將導致View的繪製出現卡頓現象,根據Google官方給出的性能優化典範中的標準,view的繪製幀率保證60fps是最佳,這就要求每幀的繪製時間爲16ms(16=1000/60),雖然程序很難做到這點,但是降低onDraw方法的複雜度確是切實有效的。

III.內存泄漏優化

內存泄漏在開發中是需要重視的一個問題,但是內存泄漏問題對開發人員的經驗和開發意識有較高的要求。內存泄漏優化主要分爲兩個方面:
①避免寫出內存泄漏的代碼;
②通過一些分析工具如MAT來找出內存泄漏的代碼繼而解決;

IV.響應速度優化和ANR日誌分析

響應速度優化的核心思想是避免在主線程中做耗時操作,但是有時候確實有很多耗時操作,可以考慮放到子線程中執行,就是採用異步的方式去處理耗時操作。響應速度過慢更多的體現在Activity的啓動上,如果在主線程中做過多的操作,可能會導致Activity啓動過程出現黑屏,甚至出現ANR異常。Android規定activity5秒內不能響應輸入事件就會出現ANR,而BroadcastReceiver 10 秒內還沒執行完操作也會出現ANR異常。ANR異常很難再代碼中發現,如何定位?當出現ANR異常時,系統會在data/anr目錄下創建一個trace.txt文件,通過分析這個文件來定位分析ANR的原因。

V. ListView和Bitmap優化

ListView主要分三個方面:
①採用ViewHolder並避免在getView方法中做耗時操作;
②要根據列表的滑動狀態來控制任務的執行頻率,比如當列表快速滑動是顯然不適合開啓大量的異步任務;
③嘗試開啓硬件加速來優化來是ListView的滑動更加順暢。

VI.線程優化

線程優化的核心思想是使用線程池,避免程序中存在大量的線程,通過線程池可以重用線程,減少由於線程的創建銷燬帶來的系統消耗,同時線程池也可以有效地控制線程池中最大的併發數,避免大量線程因互相搶佔系統資源而導致阻塞。

VII. 一些性能優化建議

①避免過多的創建兌現;
②不要過多使用枚舉,枚舉佔用的內存比整形大;
③常量請使用 static final 來修飾;
④使用一些Android特有的數據結構,如SparesArray和Pair等,他們都具有更好的性能;
⑤適當使用軟引用和弱引用;
⑥採用內存緩存和磁盤緩存;
⑦儘量採用靜態內部類,這樣可以避免潛在的由於內部類引起的內存泄漏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章