? ? 在說性能優(yōu)化之前,我們必須了解為什么要做性能優(yōu)化碰辅,首先第一點(diǎn)肯定是為了用戶體驗(yàn)懂昂,你想啊要是你的App用起來很卡,頁(yè)面加載慢騰騰的没宾,用戶能一直忍受你嗎凌彬?其二性能優(yōu)化也是對(duì)我們程序員自己的考驗(yàn),優(yōu)化過程需要我們掌握很多的東西循衰,比如說Java的內(nèi)存模型铲敛,垃圾回收機(jī)制,Dalvik和Art虛擬機(jī)会钝,Android底層等等等等知識(shí)伐蒋,還有很多工具的使用,這章主要記錄一些UI優(yōu)化方面的東西迁酸。
? ? UI優(yōu)化主要的目的是為了讓頁(yè)面更加流暢先鱼,大家都知道Android系統(tǒng)每隔16ms發(fā)出垂直同步(VSYNC)信號(hào),觸發(fā)對(duì)UI的渲染奸鬓,如果每次都在16ms內(nèi)渲染成功焙畔,達(dá)到流暢的畫面所需要的60fps(表示60楨每秒),那用戶就不會(huì)感覺到頁(yè)面的卡頓串远,
如果頁(yè)面在16ms內(nèi)還沒有繪制完宏多,就會(huì)出現(xiàn)丟幀現(xiàn)象儿惫,還是顯示的上一楨頁(yè)面,給人感覺卡住了一樣伸但,
所以我們優(yōu)化要做的事情就是盡量讓頁(yè)面在16ms內(nèi)繪制完肾请,解決這種過度繪制的問題,下面我們就具體說說怎么解決這個(gè)問題更胖。
? ? 我們的App都是有很多頁(yè)面铛铁,首先得找到要優(yōu)化的頁(yè)面,這里我推薦使用兩個(gè)工具,一個(gè)是手機(jī)自帶的顯示過度繪制區(qū)域的功能,我用的魅族手機(jī)是在開發(fā)者選項(xiàng)里面的昵慌,另一個(gè)是Android Studio自帶的工具Lint,我個(gè)人更喜歡用手機(jī)自帶的這個(gè)工具梳毙,比較直觀的顯示頁(yè)面的繪制情況,在開啟這個(gè)功能后頁(yè)面顯示如下圖捐下,
App的每個(gè)頁(yè)面的控件都會(huì)加上額外的圖層账锹,總共4種顏色,代表4種繪制的級(jí)別坷襟,如下圖奸柬,
其中紅色代表的是最嚴(yán)重的過度繪制,從上面依次減弱婴程,我們要做的就是修改這些區(qū)域廓奕,讓它達(dá)到藍(lán)色這種級(jí)別。通過使用這個(gè)工具档叔,我們能很快的找到需要修改的頁(yè)面桌粉。
在找到這個(gè)頁(yè)面后,接下來我們就得分析是什么原因?qū)е逻@個(gè)頁(yè)面過度繪制衙四,在這里我們還得使用一個(gè)工具Hierarchy View铃肯,它可以把整個(gè)頁(yè)面中每個(gè)控件的所占區(qū)域用矩形標(biāo)示出來,并計(jì)算出每個(gè)控件在測(cè)量布局和繪制所花費(fèi)的時(shí)間传蹈,而且過度繪制的控件會(huì)用紅色的圓圈標(biāo)出來押逼,至于怎么使用這個(gè)工具可以看這篇文章,通過這個(gè)工具我們可以把問題具體到某個(gè)控件上面惦界,接下來就是解決這個(gè)控件的過度繪制問題了挑格,在這里提供幾個(gè)解決的思路:
1,減少頁(yè)面的布局層次結(jié)構(gòu)。
2,減少不必要的背景圖片或背景顏色沾歪。
3,減少View的更新次數(shù)恕齐,比如調(diào)用View的requestLayout或者invalidate,setVisiable等等方法,都會(huì)導(dǎo)致View重新繪制。
4,嘗試使用Android系統(tǒng)提供<include><merge><viewstub>等標(biāo)簽显歧,不要把一大堆控件放在同一個(gè)xml布局文件里面。
5,嘗試使用RecyclerView代替ListView吧确镊,RecyclerView還能與實(shí)現(xiàn)嵌套滑動(dòng)接口的控件做各種交互士骤。
總結(jié),把自己遇到的問題寫出來蕾域,給自己提個(gè)醒拷肌,也希望能給一些人提供一個(gè)思路。
參考:
http://www.reibang.com/p/e9e05ce5b0c9,
http://www.csdn.net/article/2015-01-20/2823621-android-performance-patterns