一.布局優化
1.app裡的每一個view,android系統都會經過三部曲來渲染:measure,layout,draw。measure從最頂部的節點開始,
順着layout樹形結構依次往下,測量每個view需要在螢幕當中展示的尺寸大小,節點所處位置越深,套嵌帶來的measure越多,計算就會越費時
2.HierarchyViewer和lint工具
(1)HierarchyViewer
http://mrpeak.cn/android/2016/01/11/android-performance-ui
(2)lint的使用:
①作用:找出項目中不規範的編碼、多餘的資源、可能的bug、可能出現記憶體洩漏的地方或者其它的一些問題,然後會給出修改的建議供我們參考,
雖然這些問題并不會影響App的正常運作,不過這對于項目的規範性和維護性來說是非常重要的。
②使用:
Analyze->Inspect Code->選擇範圍點選OK
3.布局優化措施:
(1)include标簽
優點:重用布局,做代碼優化
缺點:可能會導緻産生多餘的布局嵌套
(2).merge标簽
merge标簽是為了解決include标簽導緻的多餘的布局嵌套
最外層的LinearLayout/RelativeLayout布局删除掉,換用了<merge>标簽,這就表示當有任何一個地方去include這個布局時,
會将<merge>标簽内包含的内容直接填充到include的位置,不會再添加任何額外的布局結構
(3).ViewStub:
1)對于功能:對于一個布局的一部分,我們需要控制他的隐藏跟顯示
我們一般的做法是設定它為GONE但是将元素進行隐藏,它們其實還是在布局當中的,解析布局的時候還是回将這些布局一一解析出來
我們使用ViewStub可以實作不常用的元素在需要時被加載,它沒有大小,沒有繪制功能,也不參與布局,資源消耗非常低,
将它放置在布局當中基本可以認為是完全不會影響性能的。
2)ViewStub如何使用?
把需要被隐藏的布局單獨放到一個layout布局檔案中,然後用ViewStub标簽加載
<ViewStub
android:id="@+id/viewstub_demo"
android:layout="@layout/viewstub_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
//一旦ViewStub中指定的布局加載之後,這個id也就失敗了
//ViewStub隻能Inflate一次,之後ViewStub對象會被置為空
viewstub_demo= (ViewStub) findViewById(R.id.viewstub_demo);
public void onClick(View v) {
if(viewstub_demo!=null){
//使用inflate()方法或者setVisibility(View.VISIBLE)都可以講布局加載出來
View view=viewstub_demo.inflate();
EditText et_name= (EditText) view.findViewById(R.id.et_name);
}
}
PS:ViewStub所加載的布局是不可以使用<merge>标簽的,是以這有可能導緻加載出來的布局存在着多餘的嵌套結構,具體如何
去取舍就要根據實際情況來決定了,對于那些隐藏的布局檔案結構相當複雜的情況,使用ViewStub還是一種相當不錯的選擇的
(4).盡量使用LinearLayout來代替RelativeLayout
RelativeLayout分别onMeasure()中對所有子View進行兩次measure,橫向縱向分别進行一次。
而LinearLayout隻有一次
(5)減少不必要的infalte
對于inflate的布局可以直接緩存,用全部變量代替局部變量,避免下次需再次inflate
(6)去除不必要的嵌套和View節點,Constraint Layout解決布局嵌套問題
Constraint Layout的使用:www.jianshu.com/p/a8b49ff64cd3
(7).Fragment的優化:
考慮放棄Fragment常駐記憶體的方案,不使用hide()和show()對Fragment進行控制,改用replace()等方案