1. 程式人生 > >Android之效能優化問題

Android之效能優化問題

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()
    ,Cursor.close,inputStream.close()
  • 當大量載入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