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