注:你的app為什么會(huì)卡?為什么占用大內(nèi)存?應(yīng)該怎么解決?這篇文章會(huì)給你答案。
20 條建議
1. itmap的合理使用:使用bitmap過后,就需要及時(shí)的調(diào)用recycle()方法來釋放bitmap占用的內(nèi)存空間,而不要等android系統(tǒng)來進(jìn)行釋放。
代碼示例:
// 先判斷是否已經(jīng)回收
if(bitmap != null && !bitmap.isrecycled()){
bitmap.recycle();
bitmap = null;
}
system.gc();
2. 對(duì)常量使用static final修飾符
static final int intval = 42;
static final string strval = “hello, world!”;
將一個(gè)方法或類聲明為final不會(huì)帶來性能的提升,但是會(huì)幫助編譯器制作代碼。舉例說,如果編譯器知道一個(gè)getter方法不會(huì)被重載,那么編譯器會(huì)對(duì)其采用內(nèi)聯(lián)調(diào)用。
3. 靜態(tài)方法代替虛擬方法
如果不需要訪問某對(duì)象的字段,將方法設(shè)置為靜態(tài),調(diào)用會(huì)加速15%到20%。這也是一種好的做法,因?yàn)槟憧梢詮姆椒暶髦锌闯稣{(diào)用該方法不需要更新此對(duì)象的狀態(tài)。
4. 減少不必要的全局變量
盡量避免static成員變量引用資源耗費(fèi)過多的實(shí)例,比如context,因?yàn)閏ontext的引用超過它本身的生命周期,會(huì)導(dǎo)致context泄漏。所以盡量使用application這種context類型。 可以通過調(diào)用context.getapplicationcontext()或 activity.getapplication()輕松得到application對(duì)象。
5. 避免創(chuàng)建不必要的對(duì)象: 就是避免創(chuàng)建短命的臨時(shí)對(duì)象。減少對(duì)象的創(chuàng)建就能減少垃圾收集,進(jìn)而減少對(duì)用戶體驗(yàn)的影響。
例如:頻繁操作一個(gè)字符串時(shí),使用stringbuffer代替string。
對(duì)于所有所有基本類型的組合:int數(shù)組比integer數(shù)組好,這也概括了一個(gè)基本事實(shí),兩個(gè)平行的int數(shù)組比 (int,int)對(duì)象數(shù)組性能要好很多。.避免使用浮點(diǎn)數(shù)
通常的經(jīng)驗(yàn)是,在android設(shè)備中,浮點(diǎn)數(shù)會(huì)比整型慢兩倍。
7. 使用實(shí)體類比接口好
假設(shè)你有一個(gè)hashmap對(duì)象,你可以將它聲明為hashmap或者map:
map map1 = new hashmap();
hashmap map2 = new hashmap();
哪個(gè)更好呢?
按照傳統(tǒng)的觀點(diǎn)map會(huì)更好些,因?yàn)檫@樣你可以改變他的具體實(shí)現(xiàn)類,只要這個(gè)類繼承自map接口。傳統(tǒng)的觀點(diǎn)對(duì)于傳統(tǒng)的程序是正確的,但是它并不適合嵌入式系統(tǒng)。調(diào)用一個(gè)接口的引用會(huì)比調(diào)用實(shí)體類的引用多花費(fèi)一倍的時(shí)間。如果hashmap完全適合你的程序,那么使用map就沒有什么價(jià)值。如果有些地方你不能確定,先避免使用map,剩下的交給ide提供的重構(gòu)功能好了。(當(dāng)然公共api是一個(gè)例外:一個(gè)好的api常常會(huì)犧牲一些性能)
8. 訪問成員變量比訪問本地變量慢得多
for循環(huán):不要在for的第二個(gè)條件中調(diào)用任何方法
反例:for(int i =0; i < this.getcount(); i++) {}
正例:int count = this.mcount; int count = this.getcount();
for(int i =0; i < count; i++) {
}
9. 資源類對(duì)象在不使用的時(shí)候,應(yīng)該及時(shí)關(guān)閉它們,方便它們的緩存數(shù)據(jù)能夠及時(shí)回收。
例如:cursor、file文件等都需要在finally中關(guān)閉資源性對(duì)象,避免在異常情況下資源對(duì)象未被釋放的隱患
10. 注冊(cè)廣播接收器、注冊(cè)觀察者等需要在不使用的時(shí)候取消注冊(cè)。
例如:假設(shè)在activity中,監(jiān)聽系統(tǒng)的電話服務(wù),可以在activity中定義一個(gè)phonestatelistener的對(duì)象,同時(shí)將它注冊(cè)到telephonemanager服務(wù)中。對(duì)于activity對(duì)象,理論上要求activity退出后該activity的對(duì)象就會(huì)被釋放掉。但是如果在釋放activity對(duì)象時(shí),忘記取消之前注冊(cè)的phonestatelistener對(duì)象,則會(huì)導(dǎo)致activity無法被gc回收。如果不斷的進(jìn)出這個(gè)activity,則最終會(huì)由于大量的activity對(duì)象沒有辦法被回收而引起頻繁的gc情況,甚至導(dǎo)致out of memory。
11. 有效的利用系統(tǒng)自帶的資源,android系統(tǒng)內(nèi)置了大量的資源,比如字串、顏色定義、常用icon圖片、動(dòng)畫樣式、及簡(jiǎn)單的布局,沒有特殊要求,資源可以在程序中直接引用。這樣不僅減少內(nèi)存的開銷,還可以減少apk的大小。
12. 視圖復(fù)用,使用viewholder實(shí)現(xiàn)convertview復(fù)用,這基本上是所有容器控件的處理方式,如listview、gridview等。
13. 使用最優(yōu)的數(shù)據(jù)類型,比較少的對(duì)象數(shù)時(shí),arraymap替換hashmap的使用,避免使用枚舉,枚舉變量非常方便,但不幸的是它會(huì)犧牲執(zhí)行的速度和并大幅增加文件體積。
14. 圖片內(nèi)存制作
android提供的多種位圖格式中,高的是rgb_8888,也是系統(tǒng)默認(rèn)的位圖格式,其他幾種都減少位圖通道,可以減少內(nèi)存開銷,如一些局部圖片、小屏幕手機(jī)或者對(duì)圖片質(zhì)量要求不高的場(chǎng)景,均可以使用rgb_565,或者argb_ 4444 等圖像格式。
圖片縮放:insamplesize、inscaled、indensity和intargetdensity
位圖內(nèi)存重用:inbitmap的使用,可以結(jié)合lrucache實(shí)現(xiàn)。
推薦開源庫(kù):picasso、glide
15. android 網(wǎng)絡(luò)通信框架volley。
16. 對(duì)象池、線程池的合理使用。
17. 使用intentservice替代service。
intentservice優(yōu)勢(shì):新開線程;順序處理intent;執(zhí)行完自動(dòng)退出。
18. 盡量不要因一兩個(gè)特性而使用大體積類庫(kù)。
19. 對(duì)象不用時(shí)最好顯式置為null可以減少gc開銷。
20. 多了解并使用類庫(kù)。
分享題目:20條app性能制作的建議
標(biāo)題路徑:http://m.rwnh.cn/news19/106419.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、網(wǎng)站維護(hù)、做網(wǎng)站、用戶體驗(yàn)、定制開發(fā)、網(wǎng)站制作
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源:
創(chuàng)新互聯(lián)