一星压、UI優(yōu)化
a.合理選擇RelativeLayout孽锥、LinearLayout逮光、FrameLayout,RelativeLayout會(huì)讓子View調(diào)用2次onMeasure卒落,而且布局相對復(fù)雜時(shí)话瞧,onMeasure相對比較復(fù)雜嫩与,效率比較低,LinearLayout在weight>0時(shí)也會(huì)讓子View調(diào)用2次onMeasure交排。LinearLayout weight測量分配原則划滋。
b.使用標(biāo)簽
c.減少布局層級,可以通過手機(jī)開發(fā)者選項(xiàng)>GPU過渡繪制查看埃篓,一般層級控制在4層以內(nèi)处坪,超過5層時(shí)需要考慮是否重新排版布局。
d.自定義View時(shí)架专,重寫onDraw()方法同窘,不要在該方法中新建對象,否則容易觸發(fā)GC部脚,導(dǎo)致性能下降
e.使用ListView時(shí)需要復(fù)用contentView想邦,并使用Holder減少findViewById加載View。
f.去除不必要背景委刘,getWindow().setBackgroundDrawable(null)
g.使用TextView的leftDrawabel/rightDrawable代替ImageView+TextView布局
二丧没、內(nèi)存優(yōu)化
主要為了避免OOM和頻繁觸發(fā)到GC導(dǎo)致性能下降
a.Bitmap.recycle(),Cursor.close,inputStream.close()
b.大量加載Bitmap時(shí)服傍,根據(jù)View大小加載Bitmap,合理選擇inSampleSize骂铁,RGB_565編碼方式吹零;使用LruCache緩存
c.使用 靜態(tài)內(nèi)部類+WeakReference 代替內(nèi)部類,如Handler拉庵、線程灿椅、AsyncTask
d.使用線程池管理線程,避免線程的新建
e.使用單例持有Context钞支,需要記得釋放茫蛹,或者使用全局上下文
f.靜態(tài)集合對象注意釋放
g.屬性動(dòng)畫造成內(nèi)存泄露
h.使用webView,在Activity.onDestory需要移除和銷毀烁挟,webView.removeAllViews()和webView.destory()
備:使用LeakCanary檢測內(nèi)存泄露
三婴洼、響應(yīng)速度優(yōu)化
Activity如果5秒之內(nèi)無法響應(yīng)屏幕觸碰事件和鍵盤輸入事件,就會(huì)出現(xiàn)ANR撼嗓,而BroadcastReceiver如果10秒之內(nèi)還未執(zhí)行操作也會(huì)出現(xiàn)ANR柬采,Serve20秒會(huì)出現(xiàn)ANR 為了避免ANR,可以開啟子線程執(zhí)行耗時(shí)操作且警,但是子線程不能更新UI粉捻,因此需要Handler消息機(jī)制、AsyncTask斑芜、IntentService進(jìn)行線程通信肩刃。
備:出現(xiàn)ANR時(shí),adb pull data/anr/tarces.txt 結(jié)合log分析
四杏头、其他性能優(yōu)化
a.常量使用static final修飾
b.使用SparseArray代替HashMap
c.使用線程池管理線程
d.ArrayList遍歷使用常規(guī)for循環(huán)盈包,LinkedList使用foreach
e.不要過度使用枚舉,枚舉占用內(nèi)存空間比整型大
f.字符串的拼接優(yōu)先考慮StringBuilder和StringBuffer