一.佈局優化
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()等方案