午夜91福利视频,午夜成人在线观看,午夜在线视频免费观看,午夜福利短视频,精品午夜成人免费视频APP

幫助

20條App性能優化的建議

2018-04-27 11:57 優化推廣

注:你的(de)app為什么(me)(me)會(hui)卡?為什么(me)(me)占用大內(nei)存?應(ying)該(gai)怎(zen)么(me)(me)解決?這篇(pian)文章(zhang)會(hui)給你答案。

20 條建議

1. itmap的(de)(de)合理使用:使用Bitmap過后,就需要及(ji)時(shi)的(de)(de)調用recycle()方法來釋放Bitmap占(zhan)用的(de)(de)內存空間,而不要等Android系統來進(jin)行釋放。

代碼示例:

// 先判斷是否已經回收

if(bitmap != null && !bitmap.isRecycled()){

bitmap.recycle();

bitmap = null;

}

System.gc();

2. 對(dui)常(chang)量使用static final修飾符

static final int intVal = 42;

static final String strVal = “Hello, world!”;

將一個(ge)(ge)方(fang)法或(huo)類聲明為final不會帶來性(xing)能的提升,但是(shi)會幫助(zhu)編(bian)譯器優化代碼。舉(ju)例說,如果(guo)編(bian)譯器知道一個(ge)(ge)getter方(fang)法不會被重載(zai),那(nei)么編(bian)譯器會對其(qi)采(cai)用內(nei)聯調用。

3. 靜態方法代替虛擬方法

如果(guo)不需(xu)要(yao)訪問某對(dui)象的字段,將方法(fa)(fa)設置為靜(jing)態,調用會(hui)加速15%到20%。這也是一種好(hao)的做(zuo)法(fa)(fa),因為你可以從方法(fa)(fa)聲明中(zhong)看出(chu)調用該(gai)方法(fa)(fa)不需(xu)要(yao)更(geng)新此(ci)對(dui)象的狀(zhuang)態。

4. 減少不必要的全(quan)局變量

盡(jin)量避免static成員(yuan)變量引(yin)用(yong)資源耗費過多(duo)的實(shi)例,比(bi)如Context,因(yin)為Context的引(yin)用(yong)超(chao)過它本身的生(sheng)命周(zhou)期(qi),會導致Context泄漏。所以(yi)盡(jin)量使用(yong)Application這種Context類型。 可以(yi)通過調用(yong)Context.getApplicationContext()或 Activity.getApplication()輕松得到Application對象。

5. 避(bi)免(mian)創(chuang)建(jian)不必要的(de)對(dui)(dui)象(xiang): 就是避(bi)免(mian)創(chuang)建(jian)短命的(de)臨時對(dui)(dui)象(xiang)。減(jian)少(shao)對(dui)(dui)象(xiang)的(de)創(chuang)建(jian)就能減(jian)少(shao)垃圾收集,進(jin)而減(jian)少(shao)對(dui)(dui)用戶體驗(yan)的(de)影響(xiang)。

例如:頻(pin)繁(fan)操(cao)作一個字符串時,使用StringBuffer代(dai)替(ti)String。

對于所(suo)有所(suo)有基(ji)本類型的組合:int數組比Integer數組好,這(zhe)也概(gai)括了(le)一個(ge)基(ji)本事(shi)實,兩個(ge)平行的int數組比 (int,int)對象數組性能要好很多。.避免使(shi)用(yong)浮點數

通常的(de)經驗是,在Android設備中,浮點數會比整型慢(man)兩(liang)倍。

7. 使用(yong)實(shi)體類比接(jie)口好(hao)

假設你有(you)一個HashMap對(dui)象,你可以將它聲明(ming)為(wei)HashMap或者Map:

Map map1 = new HashMap();

HashMap map2 = new HashMap();

哪個更好呢?

按照傳統的觀(guan)點Map會更好些,因為(wei)這(zhe)樣(yang)你可(ke)以改(gai)變他的具體實(shi)現類,只要這(zhe)個類繼承自Map接口。傳統的觀(guan)點對于傳統的程序(xu)是(shi)正確的,但是(shi)它并不(bu)適合嵌入式系統。調(diao)用一(yi)(yi)個接口的引(yin)用會比(bi)調(diao)用實(shi)體類的引(yin)用多(duo)花費(fei)一(yi)(yi)倍的時間。如(ru)果(guo)HashMap完全適合你的程序(xu),那么使用Map就(jiu)沒有什么價值。如(ru)果(guo)有些地方你不(bu)能(neng)確定(ding),先避免使用Map,剩下的交給IDE提供的重構功能(neng)好了。(當然公共(gong)API是(shi)一(yi)(yi)個例外:一(yi)(yi)個好的API常(chang)常(chang)會犧牲(sheng)一(yi)(yi)些性能(neng))

8. 訪(fang)問成員變量比(bi)訪(fang)問本地變量慢(man)得多

for循環:不要在(zai)for的第(di)二(er)個(ge)條件中調用任何(he)方法

反例:for(int i =0; i < this.getCount(); i++) {}

正例:int count = this.mCount;  int count = this.getCount();

for(int i =0; i &lt; count; i++) &nbsp;{

}

9. 資(zi)源類對象在不使(shi)用的(de)時(shi)候,應該及(ji)時(shi)關閉它們,方便(bian)它們的(de)緩(huan)存(cun)數據能夠(gou)及(ji)時(shi)回收。

例(li)如:Cursor、File文(wen)件等(deng)都需要在finally中關閉資源性對象,避免在異常情況(kuang)下資源對象未被釋(shi)放的隱患

10. 注冊(ce)廣(guang)播(bo)接收器、注冊(ce)觀(guan)察者等(deng)需要在不使用的時候(hou)取消注冊(ce)。

例如(ru):假設在(zai)Activity中,監聽系(xi)統的(de)電話服務,可以在(zai)Activity中定義一個(ge)PhoneStateListener的(de)對(dui)象(xiang)(xiang),同時將它注冊(ce)到TelephoneManager服務中。對(dui)于Activity對(dui)象(xiang)(xiang),理論上要求Activity退出后該Activity的(de)對(dui)象(xiang)(xiang)就會(hui)被(bei)釋(shi)放掉。但(dan)是如(ru)果在(zai)釋(shi)放Activity對(dui)象(xiang)(xiang)時,忘記取消之前注冊(ce)的(de)PhoneStateListener對(dui)象(xiang)(xiang),則會(hui)導(dao)致(zhi)Activity無法被(bei)GC回(hui)收(shou)。如(ru)果不斷的(de)進(jin)出這個(ge)Activity,則最終會(hui)由于大量的(de)Activity對(dui)象(xiang)(xiang)沒有辦法被(bei)回(hui)收(shou)而(er)引起頻繁的(de)GC情(qing)況,甚至導(dao)致(zhi)Out Of Memory。

11. 有效的(de)利用系(xi)統自帶(dai)的(de)資源,Android系統內(nei)置了大量的(de)(de)資源,比(bi)如(ru)字串、顏色定(ding)義、常用(yong)Icon圖片(pian)、動畫樣(yang)式(shi)、及簡單的(de)(de)布局,沒有特殊要求,資源可(ke)以在程序中直(zhi)接引(yin)用(yong)。這樣(yang)不僅減少內(nei)存(cun)的(de)(de)開銷,還(huan)可(ke)以減少apk的(de)(de)大小。

12. 視圖(tu)復用,使用ViewHolder實(shi)現ConvertView復用,這基(ji)本上是所有容器控件(jian)的處理方(fang)式,如(ru)ListView、GridView等(deng)。

13. 使用優(you)質的(de)數據類型,比較少的(de)對象數(shu)時(shi),ArrayMap替換HashMap的(de)使用(yong),避免(mian)使用(yong)枚舉,枚舉變(bian)量(liang)非常方(fang)便,但不幸的(de)是它會犧(xi)牲執行的(de)速度和并大幅增(zeng)加文件體積。

14. 圖片內存優化(hua)

 Android提供(gong)的(de)多種位(wei)圖(tu)格式中,最高(gao)的(de)是RGB_8888,也(ye)是系(xi)統(tong)默認的(de)位(wei)圖(tu)格式,其他幾種都(dou)減少(shao)位(wei)圖(tu)通道(dao),可(ke)以(yi)(yi)減少(shao)內存開銷,如一些局部(bu)圖(tu)片(pian)、小屏(ping)幕手機或者對圖(tu)片(pian)質量要求不高(gao)的(de)場(chang)景(jing),均(jun)可(ke)以(yi)(yi)使(shi)用RGB_565,或者ARGB_ 4444 等圖(tu)像格式。

  • 圖(tu)片縮放:inSampleSize、inScaled、inDensity和(he)inTargetDensity

  • 位圖內存重用(yong):inBitmap的使用(yong),可以(yi)結合LruCache實現(xian)。

  • 推薦開源庫:picasso、Glide

15. Android 網絡通(tong)信框架Volley。

16. 對(dui)象池、線程池的合理(li)使(shi)用。

17. 使用IntentService替(ti)代Service。

IntentService優勢:新開線程;順序處理Intent;執行(xing)完自(zi)動退出。

18. 盡量不要因一兩(liang)個特性(xing)而(er)使(shi)用大體積類庫。

19. 對象(xiang)不(bu)用(yong)時(shi)較好顯式置為(wei)Null可以減少GC開(kai)銷。

20. 多(duo)了解并使用類庫。

一些例子

1. 當處理字串的時(shi)候,盡量使用String.indexOf(),String.lastIndexOf()等特殊(shu)實(shi)現的方(fang)法。這些方(fang)法都(dou)是使用C/C++實(shi)現的,比起Java循環快 10 到 100 倍(bei)。

2. System.arraycopy方法在有JIT的Nexus One上(shang),自行編碼(ma)的循環快 9 倍。

 


3. android.text.format包下的Formatter類(lei)(lei),提供(gong)了IP地址(zhi)轉(zhuan)換、文件大小(xiao)轉(zhuan)換等方(fang)法(fa);DateFormat類(lei)(lei),提供(gong)了各種時間轉(zhuan)換,都(dou)是非常高(gao)效的方(fang)法(fa)。

4. TextUtils類(lei)(lei),對(dui)于字(zi)符(fu)串處理(li)Android為我(wo)們提供了一個簡(jian)單(dan)實用的(de)TextUtils類(lei)(lei),如果處理(li)比較簡(jian)單(dan)的(de)內容不用去思考正則表達式不妨試試這(zhe)個在(zai)android.text.TextUtils的(de)類(lei)(lei)

5. 高性能MemoryFile類,對于I/O需要頻繁操作的,主要是和外部存儲相關的I/O操作,MemoryFile通過將 NAND或SD卡上的文件,分段映射到內存中進行修改處理,這樣就用高速的RAM代替了ROM或SD卡,性能自然提高不少,對于Android手機而言同時還減少了電量消耗。該類實現的功能不是很多,直接從Object上繼承,通過JNI的方式直接在C底層執行。


推薦內存分析(xi)工具:Memory Monitor  適(shi)用于Android Studio內存優化工具

推薦內(nei)存泄露分析工作:MAT 適用于eclipse、Android Studio

內存(cun)泄露監控工(gong)具:LeakCanary

 
 


相關推薦

工作日 8:30-12:00 14:30-18:00
周(zhou)六及部分節假日(ri)提(ti)供值(zhi)班(ban)服務(wu)

易小(xiao)優(you)
轉人工 ×