標籤:開啟 measure 開發人員 ast sync win 相對 最佳化問題 eal
效能最佳化這塊,分為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效能最佳化問題總結