Android開發(fā)藝術(shù)探索之性能優(yōu)化筆記

Android性能優(yōu)化

一,優(yōu)化內(nèi)容

布局優(yōu)化、繪制優(yōu)化、內(nèi)存泄漏優(yōu)化、響應(yīng)速度優(yōu)化、ListView優(yōu)化、Bitmap優(yōu)化、線程優(yōu)化…….

二,優(yōu)化方法

1)布局優(yōu)化:盡量減少布局文件的層級

?????? ·刪除布局中的無用層級和控件

?????? ·有選擇的使用性能較高的ViewGroup.如果RelativeLayout和LinearLayout都可以使用,那就使用LinearLayout,因為RelativeLayout功能比較復(fù)雜,繪制需要花費更多的CPU時間.FrameLayout和LinearLayout一樣的簡單高效.當(dāng)一個LinearLayout或FrameLayout無法滿足需求,需要多層嵌套時,建議使用RelativeLayout,因為多層嵌套相當(dāng)于增加了布局的層級,會降低程序的性能

?????? ·合理使用標(biāo)簽.《merge》可以合并相同的布局文件,比如一個豎直方向的LinearLayout里面嵌套另一個豎直方向的LinearLayout,可以使用《merge》標(biāo)簽,可以減少一個層級。《include》標(biāo)簽用于布局的重用,指定的布局只支持layout開頭的屬性,且android:layout_width和android:layout_height必須存在。一般情況下沒《merge》和《include》配合使用。《ViewStub》是非常輕量級的控件,寬高都為0,不參與任何布局的繪制,只有在使用的時候才會加載,提高了程序初始化的性能

2)繪制優(yōu)化

?????? ·onDraw中不要創(chuàng)建新的局部對象,因為onDraw方法會被頻繁調(diào)用,這樣會產(chǎn)生大量的臨時對象,導(dǎo)致占用過多的內(nèi)存,系統(tǒng)頻繁GC,降低程序的執(zhí)行效率

?????? ·onDraw方法中不要做耗時操作,也不能執(zhí)行次數(shù)較多的循環(huán)操作,因為大量的循環(huán)會搶占CPU的時間片,導(dǎo)致繪制不流暢。

3)內(nèi)存泄露優(yōu)化(內(nèi)存泄露不會直接導(dǎo)致內(nèi)存溢出,但是會增加內(nèi)存溢出的概率

?????? ·靜態(tài)變量導(dǎo)致的內(nèi)存泄漏,靜態(tài)變量不正常使用會導(dǎo)致Activity無法正常銷毀

?????? ·單例模式導(dǎo)致內(nèi)存泄漏,單例模式的生命周期和Application一致,導(dǎo)致Activity對象無法及時釋放

4)響應(yīng)速度優(yōu)化

?????? ·避免在主線程中做耗時操作,如果無法避免,可以使用異步的方式執(zhí)行耗時操作.一般來講,如果主線程做太多的事情可能會導(dǎo)致Activity啟動時出現(xiàn)黑屏,甚至出現(xiàn)ANR,對于Activity如果5s內(nèi)無法響應(yīng)事件,BroadCastReceiver10s無法完成操作均會出現(xiàn)ANR的情況.所以一定要避免在主線程中做耗時操作

5)ListView優(yōu)化

?????? ·采用ViewHolder并避免在getView中做耗時操作

?????? ·根據(jù)列表的滑動狀態(tài)來控制執(zhí)行頻率,滑動過快的時候不適合做大量的異步任務(wù)

?????? ·開啟硬件加速使滑動更加的流暢

6)Bitmap優(yōu)化

?????? ·采用BitmapFactory.Option(進行了采樣處理)加載圖片

????? ·采用緩存策略

7)線程優(yōu)化

?????? ·采用線程池,避免程序中存在大量的Thread

8)性能優(yōu)化

?????? ·避免創(chuàng)建過多的對象.任何對象創(chuàng)建都不是免費的,每個線程的分代GC給臨時對象分配一個地址池以降低分配開銷,但是往往內(nèi)存分配要比不分配的代價大

?????? ·不要過多的使用枚舉,枚舉占用空間是整型的兩倍

?????? ·常量請使用static final 來修飾(不會進行相應(yīng)的初始化,避免了冗余操作)

?????? ·使用Android特有的數(shù)據(jù)結(jié)構(gòu),比如SparseArray和Pair等

?????? ·適當(dāng)使用軟引用和弱引用

?????? ·采用內(nèi)存緩存和磁盤緩存

?????? ·盡量使用靜態(tài)內(nèi)部類,避免由于潛在的內(nèi)部類而出現(xiàn)內(nèi)存泄漏

9)代碼優(yōu)化(提高代碼的可維護性和可擴展性)

???? ? ·命名要規(guī)范

???? ? ·排版要合理,預(yù)留合理的控件來區(qū)分不同的代碼塊

?????? ·為關(guān)鍵的代碼添加注釋

?????? ·代碼層次性要分明

10)其他優(yōu)化

?????? ·冒泡排序:原理簡單,但是包含了很多沒有意義的比較換序操作,算法臃腫,效率不高;二分歸并排序和堆排序:充分利用比較結(jié)果,避免了冗余操作,效率較高

?????? ·盡量使用StringBuffer,讓函數(shù)值直接在其后面添加,如果使用String的話,每次使用都會創(chuàng)建一個新的臨時變量

?????? ·從輸入的數(shù)據(jù)集合中讀取數(shù)據(jù)時,考慮返回原始數(shù)據(jù)的子串,而不是新建一個拷貝

?????? ·Int類型的數(shù)據(jù)效率比較高,兩個平行的Int數(shù)據(jù)要比一個(int,int)的對象數(shù)組高很多

?????? ·避免使用getter和setter.在c++中g(shù)etter和setter方法在調(diào)用的時候會被編譯器直接翻譯成相應(yīng)的字段訪問,帶來的額外的開銷,java也是相識的

?????? ·盡量使用增強for循環(huán),使用迭代器遍歷數(shù)據(jù),要比一般的迭代高效

?????? ·合理使用浮點數(shù),浮點數(shù)要比整型慢兩倍,運算絕對速度大約相差10倍

?????? ·合理使用本地方法,本地方法不一定比java高效,java和native之間的關(guān)聯(lián)是有消耗的,分配本地資源的時候往往回收比較困難,有時候會針對相同的架構(gòu)編譯出不同的版本,不能充分利用手機的ARM

三,優(yōu)化總結(jié)

????? ·優(yōu)化體現(xiàn)在方方面面,不要認為小就不去優(yōu)化,只有有好的優(yōu)化方法,一行代碼也不能放過

????? ·利用已有的規(guī)則將優(yōu)化最大化,使程序整體性能優(yōu)化

???? ·時間精力有限的情況下,不要為一些微不足道的優(yōu)化投入大量的精力

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,214評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,781評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,315評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,699評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,882評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,441評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,189評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,388評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,613評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,112評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,334評論 2 377