面試當(dāng)中一定會問的問題惭婿,你在項目當(dāng)中做了哪寫優(yōu)化箕昭?本章著重介紹我們在開發(fā)當(dāng)中對布局方面做的一些優(yōu)化項。
Android系統(tǒng)的屏幕存在著怎樣的刷新機制衣陶?
既然提到布局的優(yōu)化柄瑰,首先我就要了解Android
系統(tǒng)是怎么刷新屏幕的顯示,我們都知道如果我們想要屏幕流暢的運行剪况,那么我們就要保證UI全部的測量(Measure)教沾,布局(Layout),繪制(draw)全部的耗時在16ms內(nèi)译断。那么為什么是16ms呢授翻?
這是因為人眼與大腦的協(xié)作無法感知超過每秒60幀的畫面更新,用1000除以60得到一個大約的時間就是16ms镐作。
在布局方面我們應(yīng)該遵守哪些優(yōu)先原則藏姐?
-
FrameLayout
優(yōu)先選擇 -
RelativeLayout
的選擇優(yōu)先性取決于布局是否復(fù)雜隆箩,RelativeLayout
可以較簡單的實現(xiàn)LinearLayout
需要嵌套才可以實現(xiàn)的布局该贾。 - 當(dāng)
RelativeLayout
和LinearLayout
可以同時滿足需求時,我們優(yōu)先選擇LinearLayout
捌臊,因為RelativeLayout
實現(xiàn)較為復(fù)雜杨蛋,會出現(xiàn)重復(fù)測量的情況。通過日志打印可以看到RelativeLayout
經(jīng)常會出現(xiàn)對子View
進行兩次的測量來確保子View
被放在正確的位置上理澎。當(dāng)然如果LinearLayout
添加了weight
屬性的話逞力,也會對子View
進行兩次測量,這里需要注意的是糠爬,如果出現(xiàn)多層嵌套的話寇荧,測量的次數(shù)會成指數(shù)增長。
布局當(dāng)中要避免Overdraw
什么是Overdraw执隧?
-
Overdraw
是指屏幕上的某一個像素點在同一幀的時間繪制了多次揩抡。
我們可以通過開發(fā)者模式中打開過度繪制的開關(guān)看到屏幕的繪制情況户侥,通常情況下我們通過四種顏色來展示不同程度的Overdraw
情況。 - 藍 1xOverdraw
- 綠 2xOverdraw
- 紅 3xOverdraw
- 暗紅 4xOverdraw
當(dāng)我們程序中出現(xiàn)大范圍的紅或者暗紅的時候我們就需要對我們的布局進行優(yōu)化峦嗤。
能通過ConstaintLayout完成的布局盡可能用此布局
ConstaintLayout
屬于Android Studio 2.2的新特性蕊唐,它可以有效地解決布局嵌套過多的問題。
布局優(yōu)化中各種標(biāo)簽的使用
Android中為我們提供了三種布局的標(biāo)簽可以使用烁设,分別為include
替梨,merge
以及ViewStub
。
include
在一個布局中引入另一個布局装黑。如果多個頁面中有相同的布局副瀑,這樣可以將相同的部分提取出來,供各個layout
使用恋谭,提高代碼的復(fù)用性俗扇。這里需要注意的是include標(biāo)簽中可以覆蓋引入的layout
的跟布局的屬性,比如寬高的定義等箕别。
merge
merge
標(biāo)簽的作用主要是減少布局的嵌套層次铜幽,優(yōu)化布局層級,提高布局的加載效率串稀。他可以看作是include
標(biāo)簽的輔助以及拓展除抛,比如我們的布局跟布局是一個LinearLayout
,include
的布局文件中也是一個LinearLayout
母截,且兩個布局都是垂直布局到忽,這是我們就可以將include
布局文件中的跟布局改為merge
,這樣就減少了LinearLayout
的層級嵌套清寇,引入的方式就可以改為merge
喘漏。
ViewStub
ViewStub
只有在加載該布局的時候才會占用資源,不可見的狀態(tài)下不會對其進行繪制华烟。
一些原生View的優(yōu)化
最常問的就是ListView
的優(yōu)化
- 復(fù)用convertView翩迈,重復(fù)使用回收的view
- 使用viewholder
- 分頁加載數(shù)據(jù)
webview
的優(yōu)化
- 全局
webview
提前啟動,減少webview
首次啟動的耗時 - 代理數(shù)據(jù)請求 通過native去向網(wǎng)絡(luò)請求數(shù)據(jù)盔夜,
webview
初始化之后從native去要數(shù)據(jù)负饲。 - 優(yōu)化加載速度 設(shè)置
webview
禁止加載圖片,在初始化之后在進行圖片加載喂链。
文章主要介紹在面試中我們需要怎么回答返十,不做過深的探索,有興趣的同學(xué)可以自行研究一下椭微。