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一樣的簡單高效.當一個LinearLayout或FrameLayout無法滿足需求,需要多層嵌套時,建議使用RelativeLayout,因為多層嵌套相當于增加了布局的層級,會降低程序的性能

?????? ·合理使用標簽.《merge》可以合并相同的布局文件,比如一個豎直方向的LinearLayout里面嵌套另一個豎直方向的LinearLayout,可以使用《merge》標簽,可以減少一個層級?!秈nclude》標簽用于布局的重用,指定的布局只支持layout開頭的屬性,且android:layout_width和android:layout_height必須存在。一般情況下沒《merge》和《include》配合使用?!禫iewStub》是非常輕量級的控件,寬高都為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等

?????? ·適當使用軟引用和弱引用

?????? ·采用內(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容