1淤齐、布局優(yōu)化
???? 1)盡量減少布局文件的層級漾抬,有選擇的使用性能較低的ViewGroup盈简,比如LinearLayout碘裕、FrameLayout都是一種比較簡單高效的ViewGroup携取。但是如果因為使用這些ViewGroup而導致層級加深,還是建議使用RelativeLayout帮孔。
??? 2)采用<include>雷滋、<merge>不撑、<ViewStub>標簽。
???????? <include>和<merge>經常搭配使用減少布局的層級晤斩。<include>標簽只支持android:layout_開頭的屬性焕檬,其他屬性是不支持的,當然澳泵,id這個屬性是特例实愚,如果被包含的Layout根元素也指定了id,則以<include>指定的標簽為準兔辅。
??????? <ViewStub>繼承了View腊敲,它非常輕量級且寬高都是0,它的意義在于按需加載布局文件维苔,提高程序初始化性能.另外兔仰,目前ViewStub還不支持<merge>標簽。<ViewStub>的兩種加載方式如下:
(1)? ((ViewStub)findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);
(2)View importPanel = ((ViewStub)findViewById(R.id.stub_import)).inflate();
2蕉鸳、繪制的優(yōu)化
指View的onDraw方法要避免執(zhí)行大量的操作乎赴,主要體現(xiàn)在兩個方面。
1)在onDraw中不創(chuàng)建新的布局對象潮尝。
2)在onDraw中不做耗時的操作榕吼。
3、內存泄漏的優(yōu)化
分兩個方面:首先開發(fā)人員在開發(fā)過程中要提高意識勉失,避免寫出有內存泄漏的代碼羹蚣,另一方面是通過一些分析工具比如MAT來找出潛在的內存泄漏繼而解決。
內存泄漏場景:
???? 1)靜態(tài)變量導致的內存泄漏
???? 2)單例模式導致的內存泄漏:單例模式的生命周期跟Application保持一致乱凿,如果該單例持有Activity對象顽素,將導致Activity對象無法被釋放。
???? 3)屬性動畫導致的內存泄漏:有些無限循環(huán)的動畫會泄漏當前Activity徒蟆,即使我們已經無法看到界面了胁出,但是動畫還是一直播放,動畫會持有Activity的View段审,而View又持有了Activity全蝶,導致該Activity無法被釋放,解決辦法是在Activity的onDestroy()方法中調用animator.cancel()來停止動畫寺枉。
4抑淫、響應速度優(yōu)化和ANR日志分析
??? 響應速度優(yōu)化的核心思想是避免在主線程做耗時的操作。Android規(guī)定姥闪,Activity如果5秒鐘內無法響應屏幕觸摸事件或者鍵盤輸入事件就會出現(xiàn)ANR始苇,而BroadcaseReceiver如果10秒鐘之內未執(zhí)行完操作也會出現(xiàn)ANR。那么怎么定位問題呢筐喳?其實當一個進程發(fā)生ANR以后催式,系統(tǒng)會在/data/anr目錄下創(chuàng)建一個文件traces.txt函喉,通過分析這個文件就能定位出ANR的原因。
5蓄氧、ListView和Bitmap的優(yōu)化
6函似、線程優(yōu)化
線程優(yōu)化的思想是采用線程池,避免程序中出現(xiàn)大量的Thread喉童。線程池可以重用內部的線程撇寞,從而避免了線程的創(chuàng)建和銷毀所帶來的性能開銷,同時線程池還能有效的控制線程池的最大并發(fā)數(shù)堂氯,避免大量線程相互搶占系統(tǒng)資源從而導致阻塞現(xiàn)象的發(fā)生蔑担。
7、一些性能優(yōu)化的建議
1)避免創(chuàng)建過多的對象
2)不要過多的使用枚舉咽白,枚舉占用的內存空間比整型大啤握。
3)常量請使用static final來修飾。
4)使用一些Android特有的數(shù)據(jù)結構晶框,比如SparseArray 和Pair等排抬,他們都具有更好的性能。
5)適當?shù)氖褂密浺煤腿跻谩?/p>
6)采用內存緩存和磁盤緩存
7)盡量采用靜態(tài)內部類授段,這樣可以避免潛在的由于內部類而導致的內存泄漏蹲蒲。???