前言
今天逛稀土時偶然看到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
替代ListView
和GridView
避免內存抖動
-
不要創建大量不必要的以下對象:
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線程中做的事越少越好
-
如果應用正在執行後臺任務,最好顯示進度給用戶(例如顯示一個進度條)
-
使用Systrace或Traceview等性能工具來檢測應用響應能力的瓶頸
-
如果你的應用初始化非常耗時,考慮使用啓動頁或儘快顯示主界面,顯示加載進度的同時異步填充內容
參考文章
-
http://billynyh.github.io/tech-talks/google-android-performance-1.html
-
http://developer.android.com/training/articles/perf-tips.html