Android之效能優化問題
阿新 • • 發佈:2018-12-20
1、UI優化
- 在xml佈局檔案中,合理選擇RelativeLayout、LinearLayout、FrameLayout,其中RelativeLayout會讓子View呼叫兩次onMeasure()方法,並且佈局複雜時,onMeasure也相對複雜,效率比較低;在LinearLayout中,當weight>0時,也會讓子View呼叫兩次onMeasure
- 佈局複雜時,儘量使用<include>標籤、<merge>、<ViewStub>
- 減少佈局層級,可以通過開發者選項->GUP過度繪製檢視,一般控制在4層以內,超過5層時需要考慮重新排版佈局。
- 在自定義View中,重寫onDraw方法時,不要在內部新建物件,否則容易引發GC,導致效能下降。
- 重寫Adapter的getView()方法時,儘量複用convertView,並且用holder減少findViewById()載入View的次數
- 在圖片的周圍結合字型時,儘量採用TextView的drawableLeft或者drawableTop等方法,來代替ImageView+TextView的佈局
- 去除不必要佈局,如:getWindow().setBackgroundDrawable(null)
2、效能優化
思想:避免OOM和頻繁觸發GC導致效能下降
- 一些系統資源使用過後要及時回收,比如:Bitmap.recycle()
- 當大量載入Bitmap時,最好根據View的大小載入Bitmap,合理選擇取樣大小inSampleSize,以及影象的編碼方式如RGB_565
- 對於需要快取的,如請求的資料、載入的圖片等,最好採用LruCache策略
- 使用靜態內部類+WeakReference 代替內部類,如Handler ,執行緒,AsyncTask
- 當需要建立多條執行緒時,考慮使用執行緒池,避免頻繁建立和銷燬執行緒
- 當採用單例模式持有Context物件時,記得釋放,或者使用全域性上下文
- 屬性動畫造成記憶體洩漏
3、響應速度優化
出現ANR的情況:
- Acitivity在5s內無法響應螢幕的觸碰事件或者鍵盤輸入事件
- BroadcastReceiver在10s內未執行操作
- Service在20s內未執行操作
解決方案:
- 開啟子執行緒執行耗時操作
- 在子執行緒中如果需要更新UI,結合Handler、AsyncTask、IntentService進行通訊,注意自定義view的兩種重新整理方法:invalidate()和postInvalidate()
4、其他的效能優化:
- 常量儘量使用static final修飾(在類初始化時優先載入static修飾的常量,並且後續再建立該類物件,不會執行初始化操作)
- 使用執行緒池管理執行緒
- ArrayList遍歷採用for迴圈,LinkedList遍歷使用foreach
- 不要過度使用列舉,列舉佔用記憶體比整型大
- 字串的拼接優先考慮使用StringBuffer和StringBuilder