文章轉自:http://www.jianshu.com/p/2007ca0290d3 作者: CoderFan
前言
這個也是我面試遇到的問題,當時只回答了一種情況,異步加載數據,沒想到別的方式,回來以后專門研究了一下。
正文
Activity加載速度是很影響用戶體驗的,也是衡量一款APP質量的重要指標之一,所以優化Activity加載速度至關重要。
既然要優化首先需要了解Activity的生命周期,這里我昨天整理的有一篇文章Android四大組件之Activity—生命周期篇大家可以看看,從生命周期很明顯可以看到,Activity一個完整的生命周期中onCreate(Bundle)、onResume()、onPause()使用比較頻繁,另外onStart()因為負責的事情比較少,這里就不列入考慮。Activity之間跳轉、回退都會頻繁調用onResume()、onPause(),因此這兩個方法中不宜做過多耗時操作,而onCreate(Bundle)中更是Activity啟動后進行初始化布局的工作。
綜上,不難總結出以下幾個優化方向:
1、耗時操作要進行異步處理,盡量在onCreate(Bundle)方法中減少耗時操作,在onResume()也不可進行過多操作。
2、布局文件不可過於臃腫,必須布局優化
3、視圖加載優化
4、另外,有時候我們會用到自定義控件,所以一定要進行繪制優化
耗時操作優化
Android是不允許在UI線程也就是主線程進行耗時操作的(例如網絡請求、IO操作等等),因此要采用異步加載的方式來進行,官方推薦使用的有Handler、AsyncTask、Thread等,市場上也有很多第三方框架可供我們使用,比如RxJava,都是很不錯的解決方案,這里具體用法不再多說。
布局優化
布局優化很簡單,結合《開發藝術探索》和文末的參考文獻的文章大致有如下思路:
1、刪除多余的無用控件和層級
2、include標簽
3、merge標簽
4、ViewStub
第一點很明顯,用不到的控件和層級只會浪費渲染時間,刪除為好。
第二點和第三點,include和merge兩個最好配合使用,include減少視圖重用,merge幫助include減少視圖層級,比如include所引用布局中根布局和include引用到的布局根布局重復,使用merge可以有效解決這個問題。
最后ViewStub可以幫助我們延遲加載暫時無用的視圖,比如主頁加載數據為零,要展示空數據頁面,空頁面不是一開始就必須加載的,可以借用ViewStub在需要加載的時候進行渲染並顯示。
延遲加載優化
延遲加載除了視圖優化中用到的ViewStub外,還有一些其他情況,比如側滑菜單,剛開始是不可見的,用戶點擊或者滑動之后才會出現,這就是不必馬上加載的,可以在獲取到側滑菜單處於可見狀態的時候進行加載。另外Fragment懶加載情況也是很好的優化辦法。
自定義控件優化
隨着用戶對APP的要求越來高,自定義控件幾乎是每個APP的必備,因此自定義View帶來的問題也隨之增多,比如由此導致的OOM,內存泄露等等。這里只討論自定義控件的繪制優化,主要是針對onDraw()里的優化:
1、不要在onDraw()進行大量的操作,不要創建過多的局部對象,這會導致大量的內存開銷,從而導致系統頻繁的GC,拉低程序執行效率
2、不要在onDraw()進行耗時操作!好吧,很明顯耗時操作在Android開發中是時刻都需要注意的問題。
3、減少循環操作,成千上萬次的循環會很占用CPU的時間,導致繪制不流暢。
慎用多線程
這是文末參考文獻提到的,盡量不要在一個app內使用多進程!這塊我不熟就不多說了,先挖個坑在這里。
總結
其實提升Activity加載速度的方法就那么多,但是這是一個需要不斷進行的操作,隨着我們的項目開發總是會有新的需要優化的地方,良好的用戶體驗關系到用戶的忠誠度。
以上方法有我以前開發項目中實際用到的,結合網上查閱資料,翻閱書籍總結的,如果有不對的地方大家直接評論打臉就好。
