發(fā)布時(shí)間:2024-09-05 18:58:26 瀏覽量:114次
閱讀本文大概需要 2.6 分鐘。
在眾多高頻面試題中,Android性能優(yōu)化幾乎可以說(shuō)是必問(wèn)的考題。
而此題一出,一場(chǎng)惡戰(zhàn)已然拉開(kāi)序幕,因?yàn)榇嗽掝}牽扯面非常廣,絕非三言兩語(yǔ)就能夠聊完。因此,非常有必要對(duì)性能優(yōu)化做一下系統(tǒng)性的總結(jié)。
此篇作為性能優(yōu)化系列開(kāi)篇,是因?yàn)閁I渲染優(yōu)化最為初級(jí),且雜項(xiàng)很多,面試時(shí)可以作為回答的起點(diǎn)。
對(duì)于UI渲染優(yōu)化,記住一個(gè)宗旨:盡量減少 layout 布局嵌套層級(jí)和 View 個(gè)數(shù)。后面幾項(xiàng)其實(shí)都是圍繞著這個(gè)宗旨來(lái)做具體的優(yōu)化的。
減少嵌套層級(jí)是減少 View 樹(shù)的深度,原因一是如果 View 樹(shù)過(guò)深,會(huì)導(dǎo)致 findViewById() 方法查找耗時(shí),因?yàn)?findViewById 始終是從 rootView 開(kāi)始深度優(yōu)先遍歷,二是會(huì)導(dǎo)致繪制重疊,從而造成過(guò)度繪制。
減少 View 個(gè)數(shù),不言而喻能用最少的 View 個(gè)數(shù)實(shí)現(xiàn) UI 效果,能夠避免不必要的測(cè)量,放置,繪制的計(jì)算時(shí)間,和 View 的查找時(shí)間。
從代碼的可讀性和可維護(hù)性上來(lái)講,最簡(jiǎn)潔的東西也是最好的。
一. 布局優(yōu)化
1)盡量選用 RelativeLayout,ConstraintLayout,LinearLayout,并發(fā)揮它們的特性使布局扁平化。同等扁平的情況下,選用 LinearLayout 性能更佳。
2)利用系統(tǒng)提供 View 的特殊屬性,比如 TextView 的 drawableStart 屬性等設(shè)置 icon,就沒(méi)有必要再增加一個(gè) ImageView。TextView 滑動(dòng)屬性來(lái)避免嵌套一層 ScrollView。
3)include 一個(gè) layout 時(shí),可以考慮使用 merge 標(biāo)簽,如果布局的最外層和它所在的父容器控件相同,那么使用 merge 可以減少一個(gè)嵌套層級(jí)。
4)當(dāng)某個(gè)布局的顯現(xiàn)需要條件時(shí),比如斷網(wǎng),獲取數(shù)據(jù)失敗等顯示的 UI,可以考慮使用 ViewStub。其本質(zhì)是一個(gè)寬高為 0 的 View,非常輕量級(jí),當(dāng)需要顯示時(shí)再 inflate 或者 visible=true 才會(huì)加載其布局。
5)使用 LinearLayout 自帶的 divider 屬性實(shí)現(xiàn)分割線,而不是在布局中手動(dòng)添加一個(gè)額外的 View 作為分割線。
6)使用 Space 控件(而非 View,LinearLayout 等)進(jìn)行合理的占位。其本質(zhì)是一個(gè) onDraw 實(shí)現(xiàn)為空的 View,因此它只占位置,而不去渲染,使用它來(lái)進(jìn)行占位填充比其他控件更加高效。
二. 自定義 view 優(yōu)化
1)onDraw 中避免對(duì)象的分配。原因是 onDraw 會(huì)執(zhí)行多次,將導(dǎo)致頻繁的 GC,內(nèi)存抖動(dòng),損耗性能。
2)使用 Canvas 的 ClipRect 方法避免過(guò)度繪制。
三. 過(guò)度繪制
所謂過(guò)度繪制,就是 GPU 在同一區(qū)域進(jìn)行了不必要的多次繪制。如果進(jìn)行真機(jī)調(diào)試,打開(kāi)“調(diào)試 GPU 過(guò)度繪制”,就能看到不同的區(qū)域有不同的顏色,表示過(guò)度繪制嚴(yán)重的程度。
過(guò)度繪制的原因就是嵌套層級(jí)過(guò)深,而且設(shè)置了多余的背景色和不可見(jiàn)區(qū)域的繪制所導(dǎo)致。
1)在合適的地方設(shè)置背景。
比如要對(duì) Activity 設(shè)置背景顏色,無(wú)需在其根 Layout 上設(shè)置其 background,因?yàn)橄到y(tǒng)本身就是把 Activity 的 xml 布局添加到一個(gè)叫“content”的 FrameLayout 中,Android 系統(tǒng)本身已經(jīng)對(duì)這個(gè) FrameLayout 設(shè)置了背景顏色。
如果我們?cè)?layout.xml 的根 View 中再設(shè)置背景顏色,就相當(dāng)于 GPU 在同一區(qū)域繪制了 2 次背景色,導(dǎo)致過(guò)度繪制。
解決的辦法有 2 種:
public class MyActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在 setContentView 之前 findViewById(android.R.id.content).setBackgroundResource(xxx); setContentView(R.layout.xxx); //在自己的根 layout 中設(shè)置背景}
public class MyActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.xxx); //在自己的根 layout 中設(shè)置背景 getWindow().setBackgroundDrawable(null) //在 setContentView 之后}
2)不可見(jiàn)區(qū)域不要繪制,ClipRect & QuickReject。
當(dāng)我們?cè)谧远x View 中用到 ClipRect 時(shí),請(qǐng)只在 ClipRect 這個(gè)可見(jiàn)的矩形區(qū)域內(nèi)進(jìn)行繪制,而且通過(guò) QuickReject 來(lái)判斷另一個(gè)繪制的矩形區(qū)域是否和 ClipRect 所在矩形區(qū)域有相交,若無(wú),則可避免區(qū)域外的繪制。
一切從 android 的 handler 說(shuō)起(一)之 message
一切從 android 的 handler 說(shuō)起(二)之 threadLocal
一切從 android 的 handler 說(shuō)起(三)之 UI 線程不卡頓
一切從 android 的 handler 說(shuō)起(四)之 postDelay 原理
一切從 android 的 handler 說(shuō)起(五)之觸摸事件模型
一切從 android 的 handler 說(shuō)起(六)之生命周期來(lái)源
一切從 android 的 handler 說(shuō)起(七)之 Handler 內(nèi)存泄露
進(jìn)入公眾號(hào),回復(fù)“程序員“可以領(lǐng)取一份計(jì)算機(jī)技術(shù)電子書(shū)福利合集
歡迎轉(zhuǎn)發(fā),關(guān)注公眾號(hào) 火星時(shí)代
每天幾分鐘,掌握一個(gè)硬核面試知識(shí)點(diǎn)
熱門資訊
1. iPhone6的UI設(shè)計(jì)尺寸規(guī)范,原來(lái)如此重要!
想要了解iPhone6界面設(shè)計(jì)的尺寸規(guī)范嗎?這里為您詳細(xì)介紹iPhone6的UI設(shè)計(jì)尺寸規(guī)范,包括界面尺寸、圖標(biāo)尺寸、可點(diǎn)擊高度規(guī)范、搜索欄高度規(guī)范以及界面元素之間的距離規(guī)范。
2. 12個(gè)絕佳的UI設(shè)計(jì)網(wǎng)站,助力你的創(chuàng)作之旅!
將為大家介紹12個(gè)絕佳的UI設(shè)計(jì)網(wǎng)站,這些網(wǎng)站不僅可以為你提供靈感,還可以幫助你學(xué)習(xí)新的技巧,助力你的創(chuàng)意之旅!dribbbleDribbble 是一個(gè)面向設(shè)計(jì)師的...
3. 移動(dòng)端UI設(shè)計(jì)中常見(jiàn)的5種APP界面類型,你get到了嗎?
通過(guò)介紹移動(dòng)端UI設(shè)計(jì)中的閃屏頁(yè)、引導(dǎo)頁(yè)、浮層引導(dǎo)頁(yè)、空白頁(yè)和首頁(yè)等5種APP界面類型,幫助大家更好地了解UI設(shè)計(jì)的基本知識(shí)
4. 10個(gè)免費(fèi)學(xué)習(xí)UI設(shè)計(jì)的網(wǎng)站 提升你的設(shè)計(jì)能力
怎樣可以提升你的UI設(shè)計(jì)能力!第一個(gè):站酷站酷想必是設(shè)計(jì)師都知道的一個(gè)網(wǎng)站,里面不止有UI設(shè)計(jì)的資源,還有其他設(shè)計(jì)的,不如:平面設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、字體...
5. 移動(dòng)端列表頁(yè)和表單頁(yè)設(shè)計(jì)秘訣:讓你的APP點(diǎn)擊率翻倍
在移動(dòng)端設(shè)計(jì)中,列表頁(yè)和表單頁(yè)是不可或缺的部分。一個(gè)好的列表頁(yè)和表單頁(yè)設(shè)計(jì)能夠讓用戶輕松地獲取信息并產(chǎn)生點(diǎn)擊欲望,從而提高點(diǎn)擊率。本文將為你...
6. 推薦10本適合UI設(shè)計(jì)師看的書(shū)籍,輕松掌握技能!
對(duì)于想要提高自己的設(shè)計(jì)能力和創(chuàng)造力的小白和UI設(shè)計(jì)師來(lái)說(shuō),這本書(shū)是一個(gè)很好的選擇。4.《設(shè)計(jì)的覺(jué)醒》(IKKO TANAKA)推薦理由: 這本書(shū)是日本現(xiàn)代平面...
7. 零基礎(chǔ)學(xué)UI設(shè)計(jì)要多久?培訓(xùn)完能拿多少工資?
探索零基礎(chǔ)UI設(shè)計(jì)培訓(xùn)的時(shí)長(zhǎng)與薪資前景。了解數(shù)字藝術(shù)教育領(lǐng)域的專業(yè)課程,以及培訓(xùn)后的職業(yè)發(fā)展機(jī)會(huì)。
8. 物聯(lián)網(wǎng)APP UI設(shè)計(jì):創(chuàng)造智能硬件領(lǐng)域的沉浸式體驗(yàn)
ui設(shè)計(jì)應(yīng)該讓用戶一目了然,能夠快速找到所需的信息和功能。在設(shè)計(jì)過(guò)程中,應(yīng)盡量使用簡(jiǎn)潔的圖標(biāo)、文字和色彩,避免過(guò)多的視覺(jué)干擾。符合用戶習(xí)慣:ui設(shè)...
9. 武漢UI設(shè)計(jì)培訓(xùn)班費(fèi)用怎么樣?想學(xué)UI設(shè)計(jì)要多少錢?
想了解武漢UI設(shè)計(jì)培訓(xùn)班的費(fèi)用是多少嗎?不知道學(xué)UI設(shè)計(jì)要花多少錢?不妨看看這篇文章,了解UI設(shè)計(jì)培訓(xùn)班的學(xué)費(fèi)價(jià)格以及學(xué)習(xí)內(nèi)容。
10. 設(shè)計(jì)中的色彩心理學(xué):淺析中西方色彩的歷史演變與設(shè)計(jì)應(yīng)用
摘要:本文探討了色彩的歷史演變和設(shè)計(jì)應(yīng)用。通過(guò)對(duì)色彩在早期文明社會(huì)中的實(shí)用運(yùn)用、不同文化背景下色彩觀念的差異、色彩在設(shè)計(jì)中的重要性以及新興技...
最新文章
同學(xué)您好!