1. 程式人生 > >那些Android中的效能優化

那些Android中的效能優化


效能優化是一個大的範疇,如果有人問你在Android中如何做效能優化的,也許都不知道從哪開始說起。

首先要明白的是,為什麼我們的App需要優化,最顯而易見的時刻:使用者say,什麼狗屎,刷這麼久都沒反應,取關解除安裝算了。

這跟什麼有關,我們先蒼白的反駁下,尼瑪使用者裝置老舊網又爛,關我屁事,根本不用優化。可是,老闆拍板了,施壓給CTO,然後CTO又來找你:Y的今天必須給我想辦法優化了,不然不準回家。

好吧,為什麼從UI的表象上看,App又卡又慢而且還錯亂。我們試著來剖析下吧。

題外話:把minSDK改到4.0+,去特麼的low使用者,連手機都不願意換,還能指望它能給你帶來多少營收麼,直接pass掉吧。4.0前的系統bug不少,不能為了彌補這些bug而降低了整體的高效能。

好了,讓我們先從UI說起:

首先要明白的是UI的繪製流程measure-layout-draw,measure與layout都需要for loop所有的子控制元件,彙集起來才能完成繪製,佈局。所以子控制元件越多,所消耗的時間越長(inflate,layout_weight,relative,多層巢狀等),減少不必要的子控制元件或層級,是相當有必要的。你可以通過merge,viewstub這些標籤來減少層級巢狀。如果你的空間觀念沒那麼好,可以用HierarchyViewer工具來檢查。

對於Listview或者GridView這種多item的元件來說,複用item可以減少inflate次數,通過setTag,getTag的ViewHolder方式實現複用,這裡要注意的是,holder中的控制元件最好reset

後再賦值,避免圖片,文字錯亂。

對於ViewPager第一次顯示時卡頓以及左右滑動卡頓,有以下幾種優化方式:

    • ViewPager同時快取page數最好為最小值3,如果過多,那麼第一次顯示時,ViewPager所初始化的pager就會很多,這樣pager累積渲染耗時就會增多,看起來就卡。

    • 每個pager應該只在顯示時才載入網路或資料庫(UserVisibleHint=true),最好不要預載入資料,以免造成浪費

圖片顯示不出來或者載入時間太長,怎麼辦?分兩部分,下載速度,載入速度

    • 對於下載,要控制好同時下載的最大任務數(平均速度慢),同時給InputStream再包一層緩衝流會更快(如BufferedInputStream)。

    • 對於載入速度,我們要知道一點,雖然下載的圖片可能只有幾百K,但是decode成bitmap所佔用的記憶體可是成倍的,儘可能的減小圖片size是根本因素,讓服務端提供不同解析度的圖片才是最好的解決方案,記憶體總有耗盡的時刻,別老想著大解析度會更清晰,實際就只有150*150的空間,非給弄張1000*1000的圖片是不恰當的。另外論載入速度:記憶體>硬碟>網路,合理的使用記憶體快取也是關鍵。假如自己寫不好,沒關係,有那麼多開源的圖片快取框架,不用自己操心。

再說快取

有很多種快取方式,也不用Stay列舉了,我們要說的是搭配使用。

    • 比方說,以前我們一直在用強引用,HashMap,後來我們發現佔記憶體,我們就用軟引用,弱引用來及時回收,再後來因為回收機制不可控,所以又有了lrucache,disklrucache通過演算法來平衡記憶體與硬碟快取。隨著android版本的推進與演化,我們也應該擁抱變化。如果你的App裡還有軟引用,弱引用的地方,不妨再check下。
    • 比方說網路+資料庫。網路我們一般都是去主動獲取,而非被動接受。那如果說資料是重複的或者未更改的呢?那我們去取一次網路資料有什麼意義呢?我的解決方案是給每個activity或fragment或每個元件設定一個最大請求間隔,比如一個listview,第一次請求資料時,儲存一份到資料庫,並記下時間戳,當下次重新初始化時,判斷是否超過最大時間間隔(如5分鐘),如果沒有,只加載資料庫資料,不需要再做網路請求。當然,還有一些隱式的http請求框架會快取伺服器資料,在一定時間內不再請求網路,或者當伺服器返回304時將之前快取的資料直接返回。

反正也說到網路了,那我們也來說說

    • 現在有很多現成HTTP框架供我們使用,我們幾乎只用寫配置就可以搞定一個url請求,但是這裡有很多需要服務端配合的,比如:json資料格式,WebP代替jpg,支援斷點續傳,多個請求合併成一個,儘量不做重定向,伺服器快取以及負載均衡等。

    • 對客戶端本身,除了上述的實現,我們還需要合理的快取,控制最大請求併發量,及時取消已失效的請求,過濾重複請求,timeout時間設定,請求優先順序設定等。

優化可不是一個人的事,實現一個功能簡單,但是想優化重構,那是很不容易的事。需要多方面的預判與聯調。合理的假設與實踐是優化最重要的手段。

說完這些具體的點,我們再來說說一些常識,或者稱之為程式碼規範。

    • 你要知道for loop中不要宣告臨時變數,不到萬不得已不要在裡面寫try catch。

    • 明白垃圾回收機制,避免頻繁GC,記憶體洩漏,OOM(有機會專門說)
    • 合理使用資料型別,比如StringBuilder代替String,(筆試題最常見的是str+="str"中有幾個物件) ,少用列舉enum,少用父類宣告(List,Map)

    • 如果你有頻繁的new執行緒,那最好通過執行緒池去execute它們,減少執行緒建立開銷。

    • 你要知道單例的好處,並正確的使用它。

    • 多用常量,少用顯式的"action_key",並維護一個常量類,別重複宣告這些常量。

    • 如果可以,至少要弄懂設計模式中的策略模式,組合模式,裝飾模式,工廠模式,觀察者模式,這些能幫助你合理的解耦,即使需求頻繁變更,你也不用害怕牽一髮而動全身。需求變更不可怕,可怕的是沒有在寫程式碼之前做合理的設計。

當然還有很多很多,Stay所說的也只是一個大的輪廓,還是需要自己不斷的嘗試。會開發寫程式碼跟會做產品的區別還是蠻大的,僅僅是態度就能刷死80%的碼農了。當你碰到一些需要優化的地方,耐心的去分析,時間的累積會讓你成為真正的工程師。

另外優化也沒有絕對的完美,每一次優化都是基於當前的環境來做的,要明白溝通是最好的優化,不盲從,不隨便,三思而後行。

Android上如何做效能優化的?大概寫三年程式碼就能差不多知道了。

相關推薦

Android 效能優化工具之Hierarchy Viewer使用總結

概述 Hierarchy Viewer提供了一個視覺化的介面來觀測佈局的層級, 讓我們可以優化佈局層級, 刪除多餘的不必要的View層級, 提升佈局速度. 應用Hierarchy Viewer 目前Hierarchy Viewer只能在root過的機器才能使用. 主要是在沒有ro

Android 效能優化工具之TraceView使用總結

概述 TraceView是Android平臺配備一個很好的效能分析工具,它可以通過圖形化的方式讓我們瞭解我們要跟蹤的程式的效能,並且能具體到method。主要用於分析Android中應用程式中的hotspot,TraceView 本身只是一個數據分析工具,而資

那些Android效能優化

效能優化是一個大的範疇,如果有人問你在Android中如何做效能優化的,也許都不知道從哪開始說起。 首先要明白的是,為什麼我們的App需要優化,最顯而易見的時刻:使用者say,什麼狗屎,刷這麼久都沒反應,取關解除安裝算了。 這跟什麼有關,我們先蒼白的反駁下,尼瑪使用者裝置老舊網又爛,關我屁事,根本不用優化

Android UI效能優化實戰 識別繪製效能問題

                     1、概述2015年初google釋出了Android效能優化典範,發了16個小視訊供大家欣賞,當時我也將其下載,通過微信公眾號給大家推送了百度雲的下載地址(地址在文末,ps:歡迎大家訂閱公眾號),那麼近期google又在udacity上開了系列類的相關課程。有了上述的

Android UI效能優化 檢測應用的UI卡頓

一、概述 在做app效能優化的時候,大家都希望能夠寫出絲滑的UI介面,以前寫過一篇部落格,主要是基於Google當時釋出的效能優化典範,主要提供一些UI優化效能示例: 實際上,由於各種機型的配置不同、程式碼迭代歷史悠久,程式碼中可能會存在很多在U

Android效能優化

Android的效能優化 寫在前面: 公司給了我一週的時間去學習Android效能的優化,參考了張明雲老師的一片文章,並且用公司的實際專案進行測試(附有截圖),還進行了一些知識點,注意事項以及很多網址連結的補充,希望這篇博文能讓做效能測試的朋友們少走一些彎路。

Android圖片優化之WebP使用

一、什麼是 WebP? WebP(發音 weppy,專案主頁),是一種支援有失真壓縮和無失真壓縮的圖片檔案格式,派生自影象編碼格式 VP8。根據 Google 的測試,無失真壓縮後的 WebP 比 PNG 檔案少了 45% 的檔案大小,即使這些 PNG 檔案經過其他壓縮工具壓縮之後,WebP 還

Android效能優化

眾所周知,android裝置作為一種移動裝置,不管是cpu還是記憶體都無法跟pc裝置相提並論。這就意味著我們不能無限制地使用記憶體和cpu的資源,過多地使用記憶體會導致oom,過多地使用cpu資源,做大量的耗時任務,會導致手機變得異常卡頓,甚至無法響應出現ANR。所以我們在平常做開發時,一定要注意效

Android效能優化:電量消耗統計

電量的消耗和使用對於移動裝置非常重要,一項調查問卷顯示,電池的容量和壽命是手機最重要的營銷點:所謂“the one thing that you can't do without”。 硬體 從硬體的角度看,Android電量的消耗主要來自螢幕,CPU,網路裝置和各樣的感測器:指紋,亮度

Android App效能優化系列

Android App效能優化系列 關於Android App的優化,從第一篇的計劃開始,到記憶體優化的系列文結束,不知不覺近三個月的時間,寫了十五六篇相關的博文,算是對自己的知識的一個系統化,也希望能給大家一些幫助。 在此有對此做一個總結。 路線   Andro

Android效能優化問題

1、UI優化 在xml佈局檔案中,合理選擇RelativeLayout、LinearLayout、FrameLayout,其中RelativeLayout會讓子View呼叫兩次onMeasure()方法,並且佈局複雜時,onMeasure也相對複雜,效率比較低;在LinearLayout中

Android LeakCanary效能優化工具

效能優化工具(九)-LeakCanary 一、簡介 使用MAT來分析記憶體問題,有一些門檻,會有一些難度,並且效率也不是很高,對於一個記憶體洩漏問題,可能要進行多次排查和對比才能找到問題原因。 為了能夠簡單迅速的發現記憶體洩漏,Square公司基於MAT開源了L

Android效能優化方法

佈局優化 佈局優化的思想:儘量減少佈局檔案的層級。佈局的層級少了,這就意味著Android的繪製工作量少了,那麼程式的效能自然提高了。 如何進行佈局優化呢? 刪除佈局中無用的控制元件和層級 有選擇地使用效能較低的ViewGroup,比如RelativeL

Android應用效能優化之使用SparseArray替代HashMap

原文地址:http://liuzhichao.com/p/832.html HashMap是java裡比較常用的一個集合類,我比較習慣用來快取一些處理後的結果。最近在做一個Android專案,在程式碼中定義這樣一個變數,例項化時,Eclipse卻給出了一個 pe

android專案效能優化之啟動時間

一般來說,判定一個android專案效能優劣,我們有以下幾個指標: 啟動時間 apk大小 UI渲染 穩定性 記憶體佔用 電量消耗 接下來,讓我們就這幾個指標展開來詳述各自究竟應該怎樣去優化。 啟動時間 一般來說,應用啟動時間分為三種 首次啟動

Android ListView效能優化,非同步載入圖片

<span style="font-size:14px;"><span style="font-size:14px;">public static void initImageLoader(Context context) { personOptions = new D

App的網路測試效能優化方案

優化DNS解析和快取 由於我們的App網路服務主要基於TCP連線,為了將DNS時間降至最低,我們內建了Server IP列表,該列表可以在App啟動服務中下發更新。App啟動後的首次網路服務會從Server IP列表中取一個IP地址進行TCP連線,同時DNS解析會並

Android ListView效能優化例項講解

前言:   對於ListView,大家絕對都不會陌生,只要是做過Android開發的人,哪有不用ListView的呢?   只要是用過ListView的人,哪有不關心對它效能優化的呢?   關於如何對ListView進行效能優化,不僅是面試中常常會被問到的(我前段時間面試了

Android SQLite 效能優化——顯示使用事務-Frank Lee -專題視訊課程

Android SQLite 效能優化——顯示使用事務—3440人已學習 課程介紹        資料庫是應用開發中常用的技術,在Android應用中也不例外。Android預設使用了SQLite,介紹實際專案中遇到大量操作資料時的處理方式; 以及原理;課程收益    更加熟

[推薦]Android APP效能優化的四個方面最全總結

熱文導讀 | 點選標題閱讀作者:斜槓Allen原文:http://www.jianshu.com