一、性能優(yōu)化分類(lèi)
- 布局優(yōu)化
- 繪制優(yōu)化
- 內(nèi)存泄漏優(yōu)化
- 響應(yīng)速度優(yōu)化
- ListView優(yōu)化
- Bitmap優(yōu)化
- 線(xiàn)程優(yōu)化
二、布局優(yōu)化
盡量減少布局的嵌套
解決辦法:
多嵌套的情況下可以使用RelativeLayout
布局層級(jí)相同的情況下使用LinearLayout,它比RelativeLayout更高效
使用<include>和<merge>標(biāo)簽以及<viewStub>
參考:Android布局優(yōu)化之標(biāo)簽include,viewstub,merge
三、繪制優(yōu)化
避免在onDraw中進(jìn)行大量操作
解決辦法:
避免在onDraw中創(chuàng)建新的局部對(duì)象,onDraw可能被多次調(diào)用,從而產(chǎn)生大量的臨時(shí)對(duì)象 ,導(dǎo)致占用過(guò)多的內(nèi)存,系統(tǒng)頻繁gc。
避免在onDraw中進(jìn)行耗時(shí)操作和大量循環(huán)操作
參考:Android性能優(yōu)化:那些不可忽略的繪制優(yōu)化
四、內(nèi)存泄漏優(yōu)化
內(nèi)存泄漏:內(nèi)存泄露指的是程序申請(qǐng)了內(nèi)存以后無(wú)法釋放
內(nèi)存溢出:指的是申請(qǐng)內(nèi)存,內(nèi)存不足了
1.靜態(tài)變量導(dǎo)致的內(nèi)存泄漏
- 靜態(tài)變量持有Activity
- 靜態(tài)引用應(yīng)用非靜態(tài)內(nèi)部類(lèi)
解決辦法:
在onDestroy中使靜態(tài)變量為null(情況一二都適用)
創(chuàng)建靜態(tài)內(nèi)部類(lèi)(適用情況二)
參考:static關(guān)鍵字所導(dǎo)致的內(nèi)存泄漏問(wèn)題
2.單例模式導(dǎo)致的內(nèi)存泄漏
傳入單例模式的this使得單例模式持有Activity對(duì)象
解決辦法:
傳入不用this,而用getApplicationContext()
3.屬性動(dòng)畫(huà)導(dǎo)致的內(nèi)存泄漏
屬性動(dòng)畫(huà)有無(wú)限播放的動(dòng)畫(huà),如果沒(méi)有停止會(huì)一直播下去
解決辦法:
在onDestroy中調(diào)用cancel()方法取消播放
4.Handler導(dǎo)致的內(nèi)存泄漏問(wèn)題
Message持有Handler的引用,因?yàn)镠andler作為Activity的內(nèi)部類(lèi)會(huì)持有外部類(lèi)的引用,當(dāng)Activity finish的時(shí)候handler依舊會(huì)處理message
解決辦法:
將Handler設(shè)置為靜態(tài)的,靜態(tài)內(nèi)部類(lèi)不持有外部類(lèi)引用,并且如果要用到Activity的引用可以傳入弱引用
5.線(xiàn)程導(dǎo)致的內(nèi)存泄漏
AsyncTask或者Runnable定義為匿名內(nèi)部類(lèi),會(huì)持有外部類(lèi)的引用
解決辦法:
設(shè)置成靜態(tài)匿名內(nèi)部類(lèi),采用弱引用保存Context對(duì)象
6.資源未關(guān)閉導(dǎo)致的內(nèi)存泄漏
BroadcastReceiver,Bitmap,file,Stream,cursor等未關(guān)閉
解決辦法:
及時(shí)關(guān)閉資源,BroadcastReceiver用unregisterReceiver,file、cursor,stream用close,Bitmap用recycle關(guān)閉
五、響應(yīng)優(yōu)化
避免在主線(xiàn)程中做耗時(shí)操作
六、ListView優(yōu)化
復(fù)用ViewHolder類(lèi)
七、Bitmap優(yōu)化
先利用BitmapFactory.Options的inSampleSize屬性,根據(jù)需求對(duì)圖片進(jìn)行采樣后再加載進(jìn)來(lái)。
八、線(xiàn)程優(yōu)化
使用線(xiàn)程池