濮阳杆衣贸易有限公司

主頁(yè) > 快速排名 > 常見(jiàn)問(wèn)題 > 20條App性能優(yōu)化的建議

20條App性能優(yōu)化的建議

POST TIME:2018-12-03 17:14

 

注:你的app為什么會(huì)卡?為什么占用大內(nèi)存?應(yīng)該怎么解決?這篇文章會(huì)給你答案。

20 條建議

1. itmap的合理使用:使用Bitmap過(guò)后,就需要及時(shí)的調(diào)用recycle()方法來(lái)釋放Bitmap占用的內(nèi)存空間,而不要等Android系統(tǒng)來(lái)進(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ì)帶來(lái)性能的提升,但是會(huì)幫手編譯器優(yōu)化代碼。舉例說(shuō),如果編譯器知道一個(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)過(guò)多的實(shí)例,好比Context,因?yàn)镃ontext的引用超過(guò)它自己的生命周期,會(huì)導(dǎo)致Context泄漏。所以盡量使用Application這種Context類型。 可以通過(guò)調(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或者M(jìn)ap:

Map map1 = new HashMap();

HashMap map2 = new HashMap();

哪個(gè)更好呢?

根據(jù)傳統(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就沒(méi)有什么價(jià)值。如果有些地方你不能確定,先制止使用Map,剩下的交給IDE提供的重構(gòu)功能好了。(當(dāng)然公共API是一個(gè)例外:一個(gè)好的API常常會(huì)犧牲一些性能)

8. 拜候成員變量比拜候當(dāng)?shù)刈兞柯枚?/p>

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)的電話辦事,可以在Activity中定義一個(gè)PhoneStateListener的對(duì)象,同時(shí)將它注冊(cè)到TelephoneManager辦事中。對(duì)于Activity對(duì)象,理論上要求Activity退出后該Activity的對(duì)象就會(huì)被釋放掉。但是如果在釋放Activity對(duì)象時(shí),忘記取消之前注冊(cè)的PhoneStateListener對(duì)象,則會(huì)導(dǎo)致Activity無(wú)法被GC回收。如果不停的進(jìn)出這個(gè)Activity,則最終會(huì)由于大量的Activity對(duì)象沒(méi)有措施被回收而引起頻繁的GC情況,甚至導(dǎo)致Out Of Memory。

11. 有效的利用系統(tǒng)自帶的資源,Android系統(tǒng)內(nèi)置了大量的資源,好比字串、顏色定義、常用Icon圖片、動(dòng)畫樣式、及簡(jiǎn)單的布局,沒(méi)有特殊要求,資源可以在程序中直接引用。這樣不但減少內(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)存優(yōu)化

標(biāo)簽:林芝 九江 鹽城 東營(yíng) 烏魯木齊



收縮
  • 微信客服
  • 微信二維碼
  • 電話咨詢

  • 400-1100-266
广水市| 青田县| 瓦房店市| 临清市| 拜泉县| 连南| 绥德县| 海阳市| 三穗县| 绥棱县| 玛纳斯县| 麻江县| 中超| 温宿县| 多伦县| 淄博市| 出国| 绥化市| 桂阳县| 临漳县| 曲阳县| 射阳县| 玉环县| 宜兴市| 惠州市| 寿宁县| 多伦县| 且末县| 灌阳县| 福泉市| 突泉县| 遂宁市| 黑河市| 基隆市| 武夷山市| 乌拉特前旗| 山丹县| 赣州市| 龙里县| 迭部县| 和平县|