中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

APP性能之終端兼(jian)容(rong)優化分享

對于種類繁多Android設備適配. 對開發者來說, 也是除了應用邏輯以外需要重點考慮的一個重要因素. 因為這點將會直接影響到用戶對應用的印象和體驗. Google對此也出了很多應對措施來解決Android的碎片化.
我也來分享下我平時遇到的性能之終端兼容優化的辦法:
1, 多屏幕, 多分辨率
①這點也許這是開發者遇到的最頭疼的問題, 甚至導致某些開發者中途放棄Android, 轉投其他平臺. 其實這點并不可怕, Google為我們提供了很多resource qualifier來解決此問題. 根據不同分辨率, 不同系統版本, 不同屏幕尺寸, 不同屏幕方向, 不同語言, 不同地區, 甚至不同UI的模式, 不同的sim卡也能匹配, 具體請看下表: (附鏈接//developer.android.com/guide/topics/resources/providing-resources.html)
6.png
②盡量使用Android提供的各種Drawable來繪制(BitmapDrawable, NinePatchDrawable, ShapeDrawable等等都是對適配很有用的), 詳情見網址: //developer.android.com/guide/topics/resources/drawable-resource.html
如下代碼:

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="//schemas.android.com/apk/res/android" &gt;

    <gradient

        android:angle="90"

        android:endColor="#ff5f9dde"

      &nbsp; android:startColor="#ff3972bf" >

    </gradient>

</shape>

效果如下:
12.png
③盡量準備多套UI資源圖, 針對不同分辨率的屏幕. drawable-ldpi, drawable-mdpi, drawable-hdpi是最常見的分辨率的. 別讓mdpi的設備用hdpi的資源, 這樣會造成消耗大量的內存, 一般mdpi的設備都硬件配置都不高.
④當layout里面用到LinearLayout時, 子View用android:layout_weight來(lai)自動排布, 也是一個用作自適應(ying)不錯的選擇(ze). 就如(ru)下面代碼(ma):

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="//schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

  &nbsp; android:layout_height="fill_parent" >

    <Button

     &nbsp;  android:layout_width="0dp"

 &nbsp;      android:layout_height="wrap_content"

  &nbsp;     android:layout_weight="1" />

    <Button

 &nbsp;    &nbsp; android:layout_width="0dp"

        android:layout_height="wrap_content"

        android:layout_weight="1" />

    <Button

        android:layout_width="0dp"

      ;  android:layout_height="wrap_content"

        android:layout_weight="1" />

    <Button

 ;  &nbsp;    android:layout_width="0dp"

       ; android:layout_height="wrap_content"

        android:layout_weight="1" />

</LinearLayout>

真機上運行效果
999.png
屏幕變化
998.png
Pad
997.png
當LinearLayout的android:orientation為horizontal時別忘了將含layout_weight屬性的子View的layout_width設置成0dp. 當為vertical時, 將含layout_weight屬性的子View的layout_height設置成0dp, 這樣可以減少LinearLayout在onMeasure時計算量.
2, 多版本
①說到版本兼容性, 第一個想到的就要是用低版本sdk開發, 這樣在所有高于設備上正常運行. 但是有個弊端就是無法使用Android高版本提供新特性.
于是這個時候"Android Compatibility package"就出場了, 這個library是Google為低版本提供一些兼容高版本的特性, 如Fragment, ViewPager等等, 開發者可以在低版本的系統使用高版本的特性.
但是(shi)如果需要(yao)同時(shi)兼容(rong)高低版本. 就(jiu)需要(yao)用(yong)到android:targetSdkVersion和(he)android:minSdkVersion, android:minSdkVersion很(hen)好理解, 就(jiu)是(shi)該(gai)應用(yong)支持的(de)最低api level的(de)設(she)備, android:targetSdkVersion則是(shi)用(yong)來(lai)區分是(shi)使用(yong)"Android Compatibility package"提(ti)供的(de)兼容(rong)特性還是(shi)使用(yong)系統本身提(ti)供的(de).

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="11" />

比如上面的代碼, 就是最低版本是api level是7(Android 2.1), 當api level低于11(Android 3.0)就使用"Android Compatibility package"提供的兼容類(Fragment), 高于11(Android 3.0)就使用3.0提供的.
同時編譯的時候需要把eclipse的project build target設置成api level高于11的
②還有個版本兼容性能用到的就是Java提供的反射機制, 這樣也可以使開發者的應用在某個方法可用的時候進行調用. 這個可以通過查詢開發文檔進行查詢. 流程看下圖:
屏幕快照 2012-05-15 下午12.56.54.png
當然針對某些實例變量也能通過反射來改變, 這個就需要去查詢源碼, 不推薦.
3, UI優化
①layoutopt - 曾經作為獨立的app于sdk/tools目錄中, 高版本的sdk將他集成到ADT中了. 主要功能檢測你編寫的layout中哪些View是無用的, 哪些是可以兩個合并到一個, 達到相同的UI效果的.
該工具報出如下警告. 以便于開發者修改. 具體大家可以Google下這個工具的用法.
11:17 This LinearLayout layout or its LinearLayout parent is useless
5:22 The root-level <FrameLayout/> can be replaced with <merge/> 10:21 This LinearLayout layout or its FrameLayout parent is useless
-1:-1 This layout has too many views: 83 views, it should have <= 80!
現在該工具已經集成到ADT了, 編寫代碼的同時就會顯示出警告.
opt.png
②hierarchyviewer - 該工具位于sdk/tools目錄中. 可以幫助開發查看自己應用View的結構和嵌套的層次, 嵌套層次太多也會對性能有影響.
屏幕快照 2012-05-15 下午1.52.22.png
整個工具基本就是呈現你的應用所使用到的View, 已經層級關系. 開發者可以通過點擊節點來獲取此節點的當前狀態圖, 同時節點下會有三個可能是紅黃綠的圓點, 分別表示你的這個View在measure, layout, draw所消耗的時間和其他50%的View作對比. 就如生活中的紅黃綠燈一樣的效果. 綠色當然最好.
4. 代碼優化
①說到代(dai)碼優化, 這兒是我收集的(de)一個表格:

行為

時間

加入一個本地(di)變量                                                                1

加入一(yi)個成(cheng)員變量                                          ;                     4

調用String.length()                                          &nbsp;                 5

調用空(kong)的靜態本地方法 &nbsp;                                                      5

調(diao)用空的靜(jing)態方法                                             &nbsp;     &nbsp;            12

調(diao)用空的虛方法(fa)   ;                                &nbsp;                               12.5

調用空的接口(kou)方法                                               &nbsp;               15

調用HashMap的(de)Iterator:next()方(fang)法                      ;         165

調用HashMap 的(de)put() 方法(fa)                               ;               600

從(cong)XML展開一個(ge)視(shi)圖                                   &nbsp;            &nbsp;         22,000

展開一個(ge)包含1個(ge)TextView的LinearLayout   &nbsp;   &nbsp;            25,000

展開(kai)一個包含6個View的LinearLayout                &nbsp;           100,000

展開一個包含6個TextView的LinearLayout              &nbsp;    135,000

運行一個空(kong)的(de) activity                               ;                        3,000,000

根據表格, 就知道應該避免做哪些不必要的操作了.
②在Android源碼中也經常見到這樣的寫法, "將一個實例變量賦值給一個局部變量, 然后用這個局部變量"(局部緩存), 特別是在onDraw方法或者循環中. 會經常用到. 因為Java訪問局部變量速度會比訪問實例變量快. 這是一個用空間換時間的操作.
③盡量使(shi)用普通(tong)循(xun)環, 而(er)不(bu)是使(shi)用使(shi)用實現Iterable接口的for each循(xun)環. 因為移動設備(bei)性(xing)能有限(xian). Iterable循(xun)環會(hui)重復調用Iterator的hasNext()和next()方法, 從上面表格可以(yi)看出調用方法, 比訪問(wen)屬性(xing)更耗(hao)時.

posted on 2012-05-29 17:22  ①塊腹肌  閱讀(2155)  評論(0)    收藏  舉報