學習資料 《Android開發藝術探索》
布局優化
思想概述: 盡量減少布局文件的層次(android繪制時的工作量減小,性能提高)
布局選擇: LinearLayout(線性布局)和RelativeLayout(相對布局)
- 刪除無用的控件和層次
- 使用性能較低的ViewGroup
- LinearLyoout和RelativeLaout都可以用的時候優先選擇比較簡單的LinearLayout(FrameLayout五大布局中最簡單的一種,所有的子元素不能被指定放置的位置,統統在左上角,后面的子元素覆蓋前一個子元素)
- 如果LinearLayout和FrameLayout不可以完成的布局,需要使用嵌套的話,建議使用RelativeLayout,減少布局層次
<include>標簽(將一個布局文件加載到當前的布局文件中)
優點:不用把已經寫過的布局重新寫一遍,代碼的復用
<merge>標簽
概述:如果當前布局和包含的布局中都是豎直方向,那么使用<merge>標簽可以去掉多余的LinearLayout
優點: 一般和<include>標簽一起使用,從而減少布局的層級。
ViewStub
概述:繼承view,非常輕量級且寬高都是0,自己不參加任何布局的繪制過程
優點:按需加載所需要的布局文件,ViewStub可以在使用的時候再加載,提高程序初始化的性能。
繪制優化
概述:View的onDraw方法避免大量的操作
onDraw方法中不要創建新的局部對象(onDraw方法可能被頻繁調用,會產生大量的臨時對象,導致系統更加頻繁的gc,降低程序的執行效率)
onDraw方法中不要做耗時的任務,不能執行成千上萬次的循環操作(搶占cpu的時間片,造成View繪制過程不夠流暢,每幀的繪制時間不超過16ms)
內存泄漏優化
原因:
1 靜態變量導致的內存泄漏
原因:靜態注冊的Activity無法正常銷毀。靜態變量持有了當前的Activity,所以當前的Activity無法釋放。這個錯誤太明顯(希望不要犯這種低級錯誤)
2. 單列模式導致內存泄漏(容易忽視)
原因: Activity的對象被單列模式所持有,而單列模式的生命周期是和Applcation保持一致,因此Activity對象無法被及時釋放
3. 屬性動畫導致的內存泄漏
原因: android3.0以后,添加了屬性動畫(有一類動畫是無限循環的動畫animator.setRepeatCount(ValueAnimator.INFINITE)),如果當前的Activity沒有在onDestory方法中去停止動畫,動畫就會一直播放下去,界面無法看到動畫效果,Activity的view會被動畫持有,View有持有動畫,導致Activity無法釋放
解決方法: 在Activity的onDestory中animator.cancel方法刪除動畫。
4響應速度優化和ANR(程序無響應)日志分析
概述 :響應速度的核心思想就是避免在主線程做耗時的操作。
原因:響應速度多體現在Activity的啟動速度上,主線程如果做太多事情,會導致Activity啟動出現黑屏,甚至ANR(activity如果5s之內無法響應屏幕的操作或鍵盤錄入操作)
BroadRecevier的ANR為10s
解決:無法從代碼中發現,出現ANR時,系統會在/data/anr目錄下創建一個traces.txt,分析里面的錯誤日志查找原因
5 性能優化的建議
避免創建過多的對象
不要過多的使用枚舉,枚舉占用的內存空間要比整型大
常量使用static final修飾
采用內存緩存和磁盤緩存
采用靜態內部類,這樣可以避免潛在的由于內部類而導致的內存泄漏
- 本人很菜,學習中可能有些錯誤或不足,歡迎指正。。。