Android:性能典範:拯救計劃

前言

今天逛稀土時偶然看到hanks分享的一篇英文文章,粗略瀏覽便已覺得不錯,因此翻譯成中文,與君分享。

原文標題:Android Performance Patterns: Rescue tips
原文地址:https://medium.com/@laanayabdrzak/android-performance-patterns-rescue-tips-8c1e4c7cb1f0#.xzvcgcall

原文作者:Abderrazak Laanaya



正文

現在的app到處都是華麗的動畫、複雜的轉場效果與自定義View,然而用戶體驗必須儘可能直觀且一致。以下這些範例將會幫助你做出一個流暢、響應快速、儘可能省電的app,這些範例由一些可以提升整體應用表現的細微優化組成。

避免較差的性能

  • 避免阻塞主線程

  • 避免不必要的重繪,以免引發大範圍重繪

  • 使用 RelativeLayout 以減少佈局層級

  • 避免在 LinearLayout 中使用嵌套的 weight 屬性(這會使得每個子View measure兩次)

  • 避免不恰當地使用自定義View

  • 避免創建不必要的對象

  • 將常量聲明爲 static final(使用static會快 15% - 20%)

  • 使用基本數據類型(Integer、Float比基本數據類型慢兩倍)

  • 避免內部的 getter setter(直接訪問字段可以快3倍)

  • 優化循環語句

  • 對私有的內部類,考慮使用包訪問級別代替私有訪問級別

  • 謹慎使用native方法

自定義View

  • 遵循KISS原則

  • 在佈局中使用merge作爲根標籤(避免額外的ViewGroup

  • 使用include標籤(便於佈局的複用)

  • 避免不必要的佈局

  • 不要在onDraw中申請內存或者做複雜操作

  • 去除不必要的invalidate()調用

  • 考慮創建自己的ViewGroup

  • RecyclerView替代ListViewGridView

避免內存抖動

  • 不要創建大量不必要的以下對象:
    1, 不可變類:String
    2, 自動裝箱:Integer, Boolean…

  • 考慮使用對象池並緩存來減少內存抖動

  • 留心枚舉的開銷(一個指向枚舉的引用就要佔據4個字節)

避免內存泄漏

  • 不要在內部類裏泄漏context實例

  • 不要在activity裏泄漏view實例

  • 使用靜態內部類優於非靜態的

  • 除非key都是WeakReference,否則不要使用WeakHashmap作爲緩存

CPU

  • 佈局嵌套層次不要過多

  • 當需要時纔去進行復雜的計算【譯者注:類似懶加載】

  • 緩存複雜計算的結果以複用

  • 考慮 RenderScript 的性能

  • 儘可能減少主線程的工作

避免過度繪製

  • 簡化drawable

  • 透明部分使用.9圖

  • 設置view的透明度時多注意

  • 去除view中無用的背景

Bitmap

  • 將bitmap解碼爲需要的尺寸:BitmapFactory.Options(inSampleSize, inDensity, inTargetDensity)

  • 加載bitmap到內存時,設置尺寸爲顯示尺寸

  • 如無必要,不要進行縮放

  • 使用LRU緩存

Service

  • 除非Service在處理任務否則不要讓其保持運行。同時在任務完成時也要注意stopService

  • 系統傾向保留有Service運行的進程,那麼被service佔用的內存將無法被其他進程使用或被置換(paged out)

  • 限制service生命週期的最佳實踐是使用IntentService,它會在工作完成後結束自身

  • 讓沒必要存活的Service繼續運行是Android app內存管理最糟糕的設計之一

線程

  • 在線程的run()方法中使用   Process.setThreadPriority(THREAD_PRIORITY_BACKGROUND)可以減少該線程及UI線程的計算性能損耗

  • 如果你沒有通過上面這種方式設置線程爲低優先級,那麼該線程仍會拖慢你的app,因爲默認情況下它的優先級與UI線程的優先級相同

  • 保存當前線程的引用,以便之後可以中斷該線程。例如:當網絡連接失敗你可以取消該線程

避免ANR

  • UI線程中做的事越少越好

  • 如果應用正在執行後臺任務,最好顯示進度給用戶(例如顯示一個進度條)

  • 使用SystraceTraceview等性能工具來檢測應用響應能力的瓶頸

  • 如果你的應用初始化非常耗時,考慮使用啓動頁或儘快顯示主界面,顯示加載進度的同時異步填充內容

參考文章

  • http://billynyh.github.io/tech-talks/google-android-performance-1.html

  • http://developer.android.com/training/best-performance.html

  • http://developer.android.com/training/articles/perf-tips.html








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章