性能優化是一個大的範疇,若是有人問你在Android中如何作性能優化的,也許都不知道從哪開始提及。android
首先要明白的是,爲何咱們的App須要優化,最顯而易見的時刻:用戶say,什麼狗屎,刷這麼久都沒反應,取關卸載算了。算法
這跟什麼有關,咱們先蒼白的反駁下,尼瑪用戶設備老舊網又爛,關我屁事,根本不用優化。但是,老闆拍板了,施壓給CTO,而後CTO又來找你:Y的今天必須給我想辦法優化了,否則不許回家。數據庫
好吧,爲何從UI的表象上看,App又卡又慢並且還錯亂。咱們試着來剖析下吧。json
題外話:把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列舉了,咱們要說的是搭配使用。
反正也說到網絡了,那咱們也來講說
如今有不少現成HTTP框架供咱們使用,咱們幾乎只用寫配置就能夠搞定一個url請求,可是這裏有不少須要服務端配合的,好比:json數據格式,WebP代替jpg,支持斷點續傳,多個請求合併成一個,儘可能不作重定向,服務器緩存以及負載均衡等。
對客戶端自己,除了上述的實現,咱們還須要合理的緩存,控制最大請求併發量,及時取消已失效的請求,過濾重複請求,timeout時間設置,請求優先級設置等。
優化可不是一我的的事,實現一個功能簡單,可是想優化重構,那是很不容易的事。須要多方面的預判與聯調。合理的假設與實踐是優化最重要的手段。
說完這些具體的點,咱們再來講說一些常識,或者稱之爲代碼規範。
你要知道for loop中不要聲明臨時變量,不到萬不得已不要在裏面寫try catch。
合理使用數據類型,好比StringBuilder代替String,(筆試題最多見的是str+="str"中有幾個對象) ,少用枚舉enum,少用父類聲明(List,Map)
若是你有頻繁的new線程,那最好經過線程池去execute它們,減小線程建立開銷。
你要知道單例的好處,並正確的使用它。
多用常量,少用顯式的"action_key",並維護一個常量類,別重複聲明這些常量。
若是能夠,至少要弄懂設計模式中的策略模式,組合模式,裝飾模式,工廠模式,觀察者模式,這些能幫助你合理的解耦,即便需求頻繁變動,你也不用懼怕牽一髮而動全身。需求變動不可怕,可怕的是沒有在寫代碼以前作合理的設計。
固然還有不少不少,Stay所說的也只是一個大的輪廓,仍是須要本身不斷的嘗試。會開發寫代碼跟會作產品的區別仍是蠻大的,僅僅是態度就能刷死80%的碼農了。當你碰到一些須要優化的地方,耐心的去分析,時間的累積會讓你成爲真正的工程師。
另外優化也沒有絕對的完美,每一次優化都是基於當前的環境來作的,要明白溝通是最好的優化,不盲從,不隨便,三思然後行。
Android上如何作性能優化的?大概寫三年代碼就能差很少知道了。