那些Android上的性能優(yōu)化

性能優(yōu)化是一個大的范疇,如果有人問你在Android中如何做性能優(yōu)化的深寥,也許都不知道從哪開始說起。

首先要明白的是贤牛,為什么我們的App需要優(yōu)化惋鹅,最顯而易見的時刻:用戶say,什么狗屎殉簸,刷這么久都沒反應闰集,取關卸載算了沽讹。

這跟什么有關,我們先蒼白的反駁下武鲁,尼瑪用戶設備老舊網(wǎng)又爛爽雄,關我屁事,根本不用優(yōu)化沐鼠≈课粒可是,老板拍板了饲梭,施壓給CTO乘盖,然后CTO又來找你:Y的今天必須給我想辦法優(yōu)化了,不然不準回家憔涉。

好吧订框,為什么從UI的表象上看,App又卡又慢而且還錯亂兜叨。我們試著來剖析下吧穿扳。

題外話:把minSDK改到4.0+,去特么的low用戶浪腐,連手機都不愿意換纵揍,還能指望它能給你帶來多少營收么,直接pass掉吧议街。4.0前的系統(tǒng)bug不少泽谨,不能為了彌補這些bug而降低了整體的高性能。

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

首先要明白的是UI的繪制流程:measure-layout-draw吧雹,measure與layout都需要for loop所有的子控件,匯集起來才能完成繪制涂身,布局雄卷。所以子控件越多,所消耗的時間越長(inflate蛤售,layout_weight丁鹉,relative,多層嵌套等)悴能,減少不必要的子控件或層級揣钦,是相當有必要的。你可以通過merge,viewstub這些標簽來減少層級嵌套漠酿。如果你的空間觀念沒那么好冯凹,可以用HierarchyViewer工具來檢查。

對于Listview或者GridView這種多item的組件來說炒嘲,復用item可以減少inflate次數(shù)宇姚,通過setTag匈庭,getTag的ViewHolder方式實現(xiàn)復用,這里要注意的是浑劳,holder中的控件最好reset后再賦值阱持,避免圖片,文字錯亂呀洲。

對于ViewPager第一次顯示時卡頓以及左右滑動卡頓紊选,有以下幾種優(yōu)化方式:

  1. ViewPager同時緩存page數(shù)最好為最小值3,如果過多道逗,那么第一次顯示時,ViewPager所初始化的pager就會很多献烦,這樣pager累積渲染耗時就會增多滓窍,看起來就卡。
  2. 每個pager應該只在顯示時才加載網(wǎng)絡或數(shù)據(jù)庫(UserVisibleHint=true)巩那,最好不要預加載數(shù)據(jù)吏夯,以免造成浪費

圖片顯示不出來或者加載時間太長,怎么辦即横?分兩部分噪生,下載速度,加載速度东囚。

  1. 對于下載跺嗽,要控制好同時下載的最大任務數(shù)(平均速度慢),同時給InputStream再包一層緩沖流會更快(如BufferedInputStream)页藻。
  2. 對于加載速度桨嫁,我們要知道一點闯传,雖然下載的圖片可能只有幾百K灌危,但是decode成bitmap所占用的內存可是成倍的,盡可能的減小圖片size是根本因素俯树,讓服務端提供不同分辨率的圖片才是最好的解決方案废境,內存總有耗盡的時刻畜挨,別老想著大分辨率會更清晰,實際就只有150150的空間噩凹,非給弄張10001000的圖片是不恰當?shù)陌驮A硗庹摷虞d速度:內存>硬盤>網(wǎng)絡,合理的使用內存緩存也是關鍵栓始。假如自己寫不好务冕,沒關系,有那么多開源的圖片緩存框架幻赚,不用自己操心禀忆。

再說緩存

有很多種緩存方式臊旭,也不用Stay列舉了,我們要說的是搭配使用箩退。

  1. 比方說离熏,以前我們一直在用強引用,HashMap戴涝,后來我們發(fā)現(xiàn)占內存滋戳,我們就用軟引用,弱引用來及時回收啥刻,再后來因為回收機制不可控奸鸯,所以又有了lrucache,disklrucache通過算法來平衡內存與硬盤緩存可帽。隨著android版本的推進與演化娄涩,我們也應該擁抱變化。如果你的App里還有軟引用映跟,弱引用的地方蓄拣,不妨再check下。
  2. 比方說網(wǎng)絡+數(shù)據(jù)庫努隙。網(wǎng)絡我們一般都是去主動獲取球恤,而非被動接受。那如果說數(shù)據(jù)是重復的或者未更改的呢荸镊?那我們去取一次網(wǎng)絡數(shù)據(jù)有什么意義呢咽斧?我的解決方案是給每個activity或fragment或每個組件設置一個最大請求間隔,比如一個listview贷洲,第一次請求數(shù)據(jù)時收厨,保存一份到數(shù)據(jù)庫,并記下時間戳优构,當下次重新初始化時诵叁,判斷是否超過最大時間間隔(如5分鐘),如果沒有钦椭,只加載數(shù)據(jù)庫數(shù)據(jù)拧额,不需要再做網(wǎng)絡請求。當然彪腔,還有一些隱式的http請求框架會緩存服務器數(shù)據(jù)侥锦,在一定時間內不再請求網(wǎng)絡,或者當服務器返回304時將之前緩存的數(shù)據(jù)直接返回德挣。

反正也說到網(wǎng)絡了恭垦,那我們也來說說

  1. 現(xiàn)在有很多現(xiàn)成HTTP框架供我們使用,我們幾乎只用寫配置就可以搞定一個url請求,但是這里有很多需要服務端配合的番挺,比如:json數(shù)據(jù)格式唠帝,WebP代替jpg,支持斷點續(xù)傳玄柏,多個請求合并成一個襟衰,盡量不做重定向,服務器緩存以及負載均衡等粪摘。
  2. 對客戶端本身瀑晒,除了上述的實現(xiàn),我們還需要合理的緩存徘意,控制最大請求并發(fā)量苔悦,及時取消已失效的請求,過濾重復請求映砖,timeout時間設置间坐,請求優(yōu)先級設置等。

優(yōu)化可不是一個人的事邑退,實現(xiàn)一個功能簡單,但是想優(yōu)化重構劳澄,那是很不容易的事地技。需要多方面的預判與聯(lián)調。合理的假設與實踐是優(yōu)化最重要的手段秒拔。


說完這些具體的點莫矗,我們再來說說一些常識,或者稱之為代碼規(guī)范砂缩。

  1. 你要知道for loop中不要聲明臨時變量作谚,不到萬不得已不要在里面寫try catch。
  2. 明白垃圾回收機制庵芭,避免頻繁GC妹懒,內存泄漏,OOM(有機會專門說)
  3. 合理使用數(shù)據(jù)類型双吆,比如StringBuilder代替String眨唬,(筆試題最常見的是str+="str"中有幾個對象) ,少用枚舉enum好乐,少用父類聲明(List,Map)
  4. 如果你有頻繁的new線程匾竿,那最好通過線程池去execute它們,減少線程創(chuàng)建開銷蔚万。
  5. 你要知道單例的好處岭妖,并正確的使用它。
  6. 多用常量,少用顯式的"action_key"昵慌,并維護一個常量類假夺,別重復聲明這些常量。
  7. 如果可以废离,至少要弄懂設計模式中的策略模式侄泽,組合模式,裝飾模式蜻韭,工廠模式悼尾,觀察者模式,這些能幫助你合理的解耦肖方,即使需求頻繁變更闺魏,你也不用害怕牽一發(fā)而動全身。需求變更不可怕俯画,可怕的是沒有在寫代碼之前做合理的設計析桥。

當然還有很多很多,Stay所說的也只是一個大的輪廓艰垂,還是需要自己不斷的嘗試泡仗。會開發(fā)寫代碼跟會做產(chǎn)品的區(qū)別還是蠻大的,僅僅是態(tài)度就能刷死80%的碼農了猜憎。當你碰到一些需要優(yōu)化的地方娩怎,耐心的去分析,時間的累積會讓你成為真正的工程師胰柑。


另外優(yōu)化也沒有絕對的完美截亦,每一次優(yōu)化都是基于當前的業(yè)務來做的,要明白溝通是最好的優(yōu)化柬讨,不盲從崩瓤,不隨便,三思而后行踩官。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末却桶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子卖鲤,更是在濱河造成了極大的恐慌肾扰,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛋逾,死亡現(xiàn)場離奇詭異集晚,居然都是意外死亡,警方通過查閱死者的電腦和手機区匣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門偷拔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒋院,“玉大人,你說我怎么就攤上這事莲绰∑劬桑” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵蛤签,是天一觀的道長辞友。 經(jīng)常有香客問我,道長震肮,這世上最難降的妖魔是什么称龙? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮戳晌,結果婚禮上鲫尊,老公的妹妹穿的比我還像新娘。我一直安慰自己沦偎,他們只是感情好疫向,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著豪嚎,像睡著了一般搔驼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侈询,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天匙奴,我揣著相機與錄音,去河邊找鬼妄荔。 笑死,一個胖子當著我的面吹牛谍肤,可吹牛的內容都是我干的啦租。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼荒揣,長吁一口氣:“原來是場噩夢啊……” “哼篷角!你這毒婦竟也來了?” 一聲冷哼從身側響起系任,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤恳蹲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后俩滥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘉蕾,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年霜旧,在試婚紗的時候發(fā)現(xiàn)自己被綠了错忱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖以清,靈堂內的尸體忽然破棺而出儿普,到底是詐尸還是另有隱情,我是刑警寧澤掷倔,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布眉孩,位于F島的核電站,受9級特大地震影響勒葱,放射性物質發(fā)生泄漏浪汪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一错森、第九天 我趴在偏房一處隱蔽的房頂上張望吟宦。 院中可真熱鬧,春花似錦涩维、人聲如沸殃姓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜗侈。三九已至,卻和暖如春睡蟋,著一層夾襖步出監(jiān)牢的瞬間踏幻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工戳杀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留该面,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓信卡,卻偏偏與公主長得像隔缀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子傍菇,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,747評論 25 707
  • 0. 前言 前面有被用戶投訴 APP 流量消耗厲害: 于是乎考慮了流量方面的問題猾瘸。暫時 APP 中涉及流量的幾個方...
    zyl06閱讀 23,954評論 5 62
  • 在最好的年華遇見你喜歡的人真的是很慶幸的是,然后結婚生子丢习,可是生活總是不如意牵触,每天度日如年,我什么時候能熬過去啊咐低,...
    帆帆他娘親閱讀 106評論 0 0
  • 攝影撰文:高加索孤狼 這里沒有早中晚揽思,日出日落才是作息時間表。 漫漫黃沙渊鞋,千年的輪回绰更,胡楊是新疆的象征瞧挤。 粗獷,豪...
    自由行領隊閱讀 1,701評論 0 2
  • ?摘自:https://help.aliyun.com/document_detail/29343.html?sp...
    許你一枝花閱讀 1,195評論 0 1