Android性能優化-佈局篇

 一.佈局優化

   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()等方案
       
         
        

發佈了34 篇原創文章 · 獲贊 81 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章