adnroid效能調優
一、效能瓶頸點
整個頁面主要由6個Page的ViewPager,每個Page為一個GridView,GridView一屏大概顯示4*4的item資訊(本文最後有附圖)。由於網路資料獲取較多且隨時需要保持頁面內app下載進度及狀態,所以出現以下效能問題
a. ViewPager左右滑動明顯示卡頓
b. GridView上下滾動明顯示卡頓
c. 其他Activity返回ViewPager Activity較慢
d. 網路獲取到展現速度較慢
二、效能除錯及定位
主要使用Traceview、monkey、monkey runner除錯,traceview類似java web調優的visualvm
三、效能調優點
主要包括同步改非同步、快取、Layout最佳化、資料庫最佳化、演算法最佳化、延遲執行。
同步改非同步
這個就不用多講了,耗時操作放線上程中執行防止佔用主執行緒,一定程度上解決anr。
但需要注意執行緒和service結合(防止activity被回收後執行緒也被回收)以及執行緒的數量
執行緒池使用可見java的執行緒池
快取
java的物件建立需要分配資源較耗費時間,加上建立的物件越多會造成越頻繁的gc影響系統響應。主要使用單例模式、快取(圖片快取、執行緒池、View快取、IO快取、訊息快取、通知欄notification快取)及其他方式減少物件建立。
(1). 單例模式
對於建立開銷較大的類可使用此方法,保證全域性一個例項,在程式執行過程中該類不會因新建額外物件產生開銷。示例程式碼如下:
(2). 快取
程式中用到了圖片快取、執行緒池、View快取、IO快取、訊息快取、通知欄notification快取等。
圖片快取:見ImageCache和ImageSdCache
執行緒池:使用Java的Executors類,透過newCachedThreadPool、newFixedThreadPool、newSingleThreadExecutor、newScheduledThreadPool提供四種不同型別的執行緒池
View快取:
可見ListView快取機制
listView的getView快取
透過convertView是否為null減少layout inflate次數,透過靜態的ViewHolder減少findViewById的次數,這兩個函式尤其是inflate是相當費時間的
IO快取:
使用具有快取策略的輸入流,BufferedInputStream替代InputStream,BufferedReader替代Reader,BufferedReader替代BufferedInputStream.對檔案、網路IO皆適用。
訊息快取:透過 Handler 的 obtainMessage 回收 Message 物件,減少 Message 物件的建立開銷
handler.sendMessage(handler.obtainMessage(1));
通知欄notification快取:下載中需要不斷改變通知欄進度條狀態,如果不斷新建Notification會導致通知欄很卡。這裡我們可以使用最簡單的快取
MapnotificationMap = new HashMap ();如果notificationMap中不存在,則新建notification並且put into map.
(3). 其他
能建立基類解決問題就不用具體子類:除需要設定優先順序的執行緒使用new Thread建立外,其餘執行緒建立使用new Runnable。因為子類會有自己的屬性建立需要更多開銷。
控制最大併發數量:使用Java的Executors類,透過Executors.newFixedThreadPool(nThreads)控制執行緒池最大執行緒併發
對於http請求增加timeout
Layout最佳化
使用抽象佈局標籤(include, viewstub, merge)、去除不必要的巢狀和View節點、減少不必要的infalte及其他Layout方面可調優點,順帶提及佈局調優相關工具(hierarchy viewer和lint)。具體可見效能最佳化之佈局最佳化
TextView屬性最佳化:TextView的android:ellipsize=”marquee”跑馬燈效果極耗效能,具體原因還在深入原始碼中
資料庫最佳化
主要包括索引和事務及針對Sqlite的最佳化。具體可見效能最佳化之資料庫最佳化
演算法最佳化
這個就是個博大精深的話題了,只介紹本應用中使用的。
使用hashMap代替arrayList,時間複雜度降低一個數量級
延遲執行
對於很多耗時邏輯沒必要立即執行,這時候我們可以將其延遲執行。
執行緒延遲執行 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(10);
訊息延遲傳送 handler.sendMessageDelayed(handler.obtainMessage(0), 1000);
四、本程式效能調優結果
ViewPager左右滑動明顯示卡頓
GridView上下滾動明顯示卡頓
(1). 去掉TextView的android:ellipsize=”marquee”
(2). 修改圖片快取的最大執行緒數,增加http timeout
(3). 修改設定app是否已安裝的狀態,具體程式碼修改如下
其他Activity返回ViewPager Activity較慢
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/964/viewspace-2812792/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Spark 效能調優--資源調優Spark
- 【效能調優】效能測試、分析與調優基礎
- ElasticSearch效能調優Elasticsearch
- 效能調優學習之硬體調優
- 效能調優實戰
- Linux之效能調優Linux
- 效能監控調優
- linux調優效能命令Linux
- .Net效能調優-ArrayPool
- .Net效能調優-MemoryPool
- TiDB 效能分析&效能調優&優化實踐大全TiDB優化
- Nginx安全優化與效能調優Nginx優化
- solr研磨之效能調優Solr
- Kafka 線上效能調優Kafka
- 2. 效能調優概述
- java效能調優記錄Java
- android效能調優詳解Android
- 效能調優命令之jstackJS
- 淺談Nginx效能調優Nginx
- 【譯】React 應用效能調優React
- Spark學習——效能調優(一)Spark
- Spark學習——效能調優(二)Spark
- Spark學習——效能調優(三)Spark
- java效能調優記錄(限流)Java
- 記一次效能調優
- go效能調優之火焰圖Go
- 深入理解JVM效能調優JVM
- Oracle 效能調優工具:SQL MonitorOracleSQL
- 效能調優五步法
- 效能調優的通用準則
- MySQL入門--效能調優概述MySql
- Linux系統效能調優技巧Linux
- 效能調優——SQL最佳化SQL
- Hive效能調優實踐 - VidhyaHive
- 效能測試瓶頸調優
- Linux效能調優命令之freeLinux
- 《java學習三》jvm效能優化-------調優JavaJVM優化
- Golang pprof 效能調優實戰,效能提升 3 倍!Golang