成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺議那些Android中的性能優化

移動開發 Android
Android上如何做性能優化的?性能優化是一個大的范疇,如果有人問你在Android中如何做性能優化的,也許都不知道從哪開始說起。

性能優化是一個大的范疇,如果有人問你在Android中如何做性能優化的,也許都不知道從哪開始說起。首先要明白的是,為什么我們的App需要優化,最顯而易見的時刻:用戶say,什么狗屎,刷這么久都沒反應,取關卸載算了。

[[148281]]

這跟什么有關,我們先蒼白的反駁下,尼瑪用戶設備老舊網又爛,關我屁事,根本不用優化。可是,老板拍板了,施壓給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上如何做性能優化的?大概寫三年代碼就能差不多知道了。

原文鏈接:http://www.cnblogs.com/stay/p/4784014.html

責任編輯:Ophira 來源: 博客園
相關推薦

2022-04-08 09:47:55

性能優化開發

2022-04-13 10:03:59

性能優化性能分析工具JVM

2022-02-18 19:24:15

性能優化代碼

2014-03-27 11:34:09

C#優化性能優化

2010-04-29 16:46:59

Unix進程

2017-04-27 10:20:13

Android內存優化圖片

2010-04-09 15:08:17

Oracle 數據庫性

2021-07-14 11:13:46

線程性能優化阿里云

2011-07-15 14:46:18

PHP

2021-07-29 14:20:34

網絡優化移動互聯網數據存儲

2013-09-16 15:16:20

Android性能優化

2011-02-16 09:57:41

2016-09-14 22:22:03

Android Vue性能優化

2017-01-15 15:13:37

Android性能優化優化點

2020-05-20 13:24:28

MySQL優化數據庫

2019-07-25 13:22:43

AndroidAPK文件優化

2019-12-13 10:25:08

Android性能優化啟動優化

2022-09-15 08:33:11

ChaosBladeJava場景

2010-05-12 14:14:41

MySQL性能優化

2013-02-20 14:32:37

Android開發性能
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区三区精品 | 亚洲一区电影 | 欧美一区二区三区在线视频 | 欧美狠狠操 | 午夜精品视频在线观看 | 国产高清一区二区三区 | 在线亚洲欧美 | 两性午夜视频 | 精品欧美乱码久久久久久1区2区 | 麻豆成人在线视频 | 欧美黄色一区 | 天天干天天玩天天操 | 亚洲电影成人 | 久久精品一区二区三区四区 | 国产精品久久久久久久久久久免费看 | 日韩一区中文字幕 | 国产亚洲精品综合一区 | 久久精品色欧美aⅴ一区二区 | 久久久久久综合 | 99在线免费视频 | 日本天堂视频在线观看 | 成年人在线播放 | 欧美一区二区大片 | 精品一二区 | 成人免费一区二区三区牛牛 | 天堂成人国产精品一区 | 91亚洲精品在线观看 | 青青激情网 | 免费小视频在线观看 | 成人国产精品久久 | 久久久青草婷婷精品综合日韩 | 一级a性色生活片久久毛片波多野 | 亚洲国产精品视频一区 | av中文字幕在线 | 亚洲精品二区 | 久久精品免费一区二区三 | 伊人伊人 | 国产一区二区视频在线观看 | 国产精品久久久久久高潮 | 精品一区二区三区日本 | 二区在线观看 |