1. 程式人生 > >Android性能優化問題總結

Android性能優化問題總結

自定義 stream 靜態內部類 left move 容易 過渡 分析 async

  性能優化這塊,分為UI性能優化、內存優化、數據庫優化、網絡優化、耗電優化等等。可以從1.如何發現問題,2.怎麽解決問題,3.解決效果對比,這幾個方面去描述。舉個簡單例子——UI優化,可以從 UI出現什麽問題(卡頓不流暢),怎麽查找問題(手機開發者權限>GPU過度繪制 發現層級問題,TraceView CPU使用情況分析),怎麽解決問題(降低層級、自定義View繪圖出現問題等),解決問題後性能再次對比。

一、UI優化

a.合理選擇RelativeLayout、LinearLayout、FrameLayout,RelativeLayout會讓子View調用2次onMeasure,而且布局相對復雜時,onMeasure相對比較復雜,效率比較低,LinearLayout在weight>0時也會讓子View調用2次onMeasure。LinearLayout weight測量分配原則。

b.使用標簽

c.減少布局層級,可以通過手機開發者選項>GPU過渡繪制查看,一般層級控制在4層以內,超過5層時需要考慮是否重新排版布局。

d.自定義View時,重寫onDraw()方法,不要在該方法中新建對象,否則容易觸發GC,導致性能下降

e.使用ListView時需要復用contentView,並使用Holder減少findViewById加載View。

f.去除不必要背景,getWindow().setBackgroundDrawable(null)

g.使用TextView的leftDrawabel/rightDrawable代替ImageView+TextView布局

二、內存優化

主要為了避免OOM和頻繁觸發到GC導致性能下降

a.Bitmap.recycle(),Cursor.close,inputStream.close()

b.大量加載Bitmap時,根據View大小加載Bitmap,合理選擇inSampleSize,RGB_565編碼方式;使用LruCache緩存

c.使用 靜態內部類+WeakReference 代替內部類,如Handler、線程、AsyncTask

d.使用線程池管理線程,避免線程的新建

e.使用單例持有Context,需要記得釋放,或者使用全局上下文

f.靜態集合對象註意釋放

g.屬性動畫造成內存泄露

h.使用webView,在Activity.onDestory需要移除和銷毀,webView.removeAllViews()和webView.destory()

備:使用LeakCanary檢測內存泄露

三、響應速度優化

Activity如果5秒之內無法響應屏幕觸碰事件和鍵盤輸入事件,就會出現ANR,而BroadcastReceiver如果10秒之內還未執行操作也會出現ANR,Serve20秒會出現ANR 為了避免ANR,可以開啟子線程執行耗時操作,但是子線程不能更新UI,因此需要Handler消息機制、AsyncTask、IntentService進行線程通信。

備:出現ANR時,adb pull data/anr/tarces.txt 結合log分析

四、其他性能優化

a.常量使用static final修飾

b.使用SparseArray代替HashMap

c.使用線程池管理線程

d.ArrayList遍歷使用常規for循環,LinkedList使用foreach

e.不要過度使用枚舉,枚舉占用內存空間比整型大

f.字符串的拼接優先考慮StringBuilder和StringBuffer

g.數據庫存儲是采用批量插入+事務

Android性能優化問題總結