天天看點

優化Android App性能?十大技巧必知!

http://blog.csdn.net/qijianke2014/article/details/40041331

無論錘子還是茄子手機的不斷冒出,android系統的手機市場占有率目前來說還是最大的,是以基于android開發的app數量也是很龐大的。那麼,如何能開發出更高性能的android app?相信是軟體開發公司以及廣大程式員們頭疼的一大難題。今天,就給大家提供幾個提高android app性能的技巧。

我們知道app運作過程中所有的操作都預設在主線程(ui線程)中進行的,這樣app的響應速度就會受到影響。會導緻程式陷入卡頓、死掉甚至會發生系統錯誤。

為了加快響應速度,需要把費時的操作(比如網絡請求、資料庫操作或者複雜的計算)從主線程移動到一個單獨的線程中。最高效的方式就是在類這一級完成 這項操作,可以使用asynctask或者intentservice來建立背景操作。如果選擇使用intentservice,它會在需要的時候啟動起 來,然後通過一個工作線程來處理請求(intent)。

使用intentservice時需要注意以下幾點限制:

這個類不要給ui傳遞資訊,如果要向使用者展示處理結果資訊請用activity;

每次隻能處理一個請求;

每一個處理請求過程都不能中斷;

從ui線程中移除費時操作這個方式還可以防止使用者操作出現系統不響應(anr)對話框。需要做的就是繼承asynctask來建立一個背景工作線程,并實作doinbackground()方法。

還有一種方式就是自己建立一個thread類或者handlerthread類。需要注意這樣也會使app變慢,因為預設的線程優先級和主線程的優先級是一樣的,除非你明确設定線程的優先級。

當查詢操作正在背景處理時,展示資料也不是即時的,但是你可以使用cursorloader對象來加快速度,這個操作可以使activity和使用者之間的互動不受影響。

使用這個對象後,你的app會為contentprovider初始化一個獨立的背景線程進行查詢,當查詢結束後就會給調用查詢的activity傳回結果。

使用strictmode來檢查ui線程中可能潛在的費時操作;

使用一些特殊的工具如safe.ijiami、systrace或者traceview來尋找在你的應用中的瓶頸;

用進度條向使用者展示操作進度;

如果初始化操作很費時,請展示一個歡迎界面。

如果應用很費電,請不要責怪使用者解除安裝了你的應用。對于電池使用來說,主要費電情況如下:

更新資料時經常喚醒程式;

用edge或者3g來傳遞資料;

文本資料轉換,進行非jit正規表達式操作。

如果沒有網絡連接配接,請讓你的應用跳過網絡操作;隻在有網絡連接配接并且無漫遊的情況下更新資料;

選擇相容的資料格式,把含有文本資料和二進制資料的請求全部轉化成二進制資料格式請求;

使用高效的轉換工具,多考慮使用流式轉換工具,少用樹形的轉換工具;

為了更快的使用者體驗,請減少重複通路伺服器的操作;

如果可以的話,請使用framework的gzip庫來壓縮文本資料以高效使用cpu資源。

如果考慮使用wakelocks,盡量設定為最小的級别;

為了防止潛在的bug導緻的電量消耗,請明确指定逾時時間;

啟用 android:keepscreenon屬性;

除了系統的gc操作,多考慮手動回收java對象,比如xmlpullparserfactory和bitmapfactory。還有正規表達式的matcher.reset(newstring)操作、stringbuilder.setlength(0)操作;

要注意同步的問題,盡管在主線程中是安全的;

在listview中要多采用重複利用政策;

如果允許的話多使用粗略的網絡定位而不用gps,對比一下gps需要1mah(25s * 140 ma),而一般網絡隻用0.1mah(2s * 180ma);

確定登出gps的位置更新操作,因為這個更新操作在onpause()中也是會繼續的。當所有的應用都登出了這個操作,使用者可以在系統設定中重新啟用gps而不浪費電量;

請考慮在大量數理運算中使用低精度變量并在用displaymetrics進行dpi任務時緩存變量值;

請確定service生命周期都是短暫的,因為每個程序都需要2mb的記憶體,而在前台程式需要記憶體時也會重新啟動;

保持記憶體的使用量不要太大;

如果要應用每30分鐘更新一次,請在裝置處于喚醒狀态下進行;

service在pull或者sleep狀态都是不好的,這就是為什麼在服務結束時要使用alarmmanager或者配置屬性stopself()的原因。

在進行整體更新之前檢查電池的狀态和網絡狀态,等待最好的狀态在進行大幅度裝換操作;

讓使用者看到用電情況,比如更新周期,背景操作的時候;

當我們為布局單獨建立ui的時候,就是在建立濫用記憶體的app,它在ui中會出現可惡的延時。要實作一個流暢的、低記憶體占用的ui,第一步就是搜尋 你的應用找出潛在的瓶頸布局。使用android sdk/tools/中自帶的hierarchy viewer tool工具。

還有一個很好的工具就是lint,它會掃描應用的源碼去尋找可能存在的bug,并為控件結果進行優化。

如果布局顯示結果發現了問題,你可以考慮簡化布局結構。可以把linearlayout類型轉化成relativelayout類型,降低布局的層級結構。

以上的每個小技巧,希望它能成為你日常代碼的一部分,然後你就會看到意想不到的結果。要讓google play看到更多傑出的、流暢的、更快速、更省電的應用,向android走向完美的目标邁進一步。

繼續閱讀