Android 性能優化

jopen 10年前發布 | 36K 次閱讀 Android Android開發 移動開發

一. 通過inflate在Activity中布局是個有性能消耗的過程。每增加一個嵌套的布局和視圖都會對應用的性能造成很大的影響。


總之,好的實踐是盡量保持布局盡可能簡單,尤其是要避免嵌套inflate操作整個新的布局,這是為更新已經存在布局的小變化。

以下幾點是包含在Android最佳實踐指導原則里的,當然并不絕對:

避免不必要的嵌套:不要把一個布局放置在其他布局里,除非是必要的。
避免使用太多視圖:在一個布局中每增加一個新的視圖,都會在inflate操作時耗時和消耗資源。任何時候都不要在一個布局中包含超過80個視圖,否則,消耗在inflate操作上的時間會很大。
避免深度嵌套:布局可以任意嵌套,這極易于創建復雜和深度嵌套的布局層次。如果沒有硬性限制,將嵌套限制在10層以下是好的實踐。
優化布局層次,比如減少沒效率的或者不必要的嵌套布局,是十分重要的。

Android SDK包含了layoutopt,一個命令行工具,來輔助這個優化工作。運行該命令,參數是布局文件或者布局文件的目錄,將分析并給出改善的建議。


二.Android布局優化:


 1、優化布局層次結構


 避免布局嵌套,此外幾個嵌套的LinearLayout實例使用layout_weight參數會導致兩次測量,特別是重復的添加,比如ListView、GridView。避免layout_weight


  1)、檢查你的布局


   通過tools/hierarchyviewer.bat找到布局性能瓶頸。


 2)、使用Lint檢查(幾個例子)


   LinearLayout保護一個imageview和textView可以使用一個控件來實現。 textView屬性android:drawableLeft="@drawable/up“


 如根標簽僅作為跟布局(無背景等),使用<merge>替代。在代碼中inflate一個以merge為根元素的布局文件時候,你需要指定一個ViewGroup 作為其容器,并且要設置attachToRoot 為true

  刪除沒子控件、沒背景的布局

  如果一個layout只有子控件,沒有兄弟控件,并且不是一個ScrollView或者根節點,而且沒有設置背景,那么我們可以移除這個父控件,直接把子控件提升為父控件。

  盡量減少內嵌的層級,考慮使用更多平級的組件 RelativeLayout or GridLayout來提升布局性能,默認最大的深度是10


2、復用布局<include/>

    創建可重用的layout組件

   使用定義的組件<includelayout="@layout/titlebar"/>

    <FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"

       android:layout_width=”match_parent”

      android:layout_height="wrap_content"

      android:background="@color/titlebar_bg">

   <ImageViewandroid:layout_width="wrap_content"

       android:layout_height="wrap_content"

      android:src="@drawable/gafricalogo" />

 </FrameLayout>


<include android:id=”@+id/news_title”android:layout_width=”match_parent” android:layout_height=”match_parent”layout=”@layout/title”/>

  三、動態加載視圖
   有時候我們需要復雜的視圖且少用,我們可以按需要的時候裝載以便減少內存,提高體驗。原來我們都是設置在布局中,然后使用View.GONE屬性,但是好資源影響性能。ViewStub是一個輕量級的View,它一個看不見的,不占布局位置,占用資源非常小的控件

定義ViewStub

<ViewStubandroid:id="@+id/stub_import" android:inflatedId="@+id/panel_import"android:layout="@layout/progress_overlay"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_gravity="bottom" />

三. Android布局優化幾個重要標簽的使用include、merge、ViewStub、requestFocus
include:用于布局的復用
merge:削減布局層級來實現盡量扁平化,僅可作為根節點,多與include結合使用
requestFocus:設置獲取焦點的view
ViewStub:不占用任何內存,通過inflate()來加載內部的views

 

注:

<merge>也有一些使用限制: 只能用于xml layout文件的根元素;在代碼中使用LayoutInflater.Inflater()一個以merge為根元素的

布局文件時候,需要使用View inflate (int resource, ViewGroup root, boolean attachToRoot)指定一個ViewGroup 作為其容器,并且要設置attachToRoot 為true。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!