天天看點

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

繼續閱讀