adnroid效能調優

airland發表於2021-09-09

一、效能瓶頸點

整個頁面主要由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最佳化、資料庫最佳化、演算法最佳化、延遲執行。

  1. 同步改非同步

    這個就不用多講了,耗時操作放線上程中執行防止佔用主執行緒,一定程度上解決anr。

但需要注意執行緒和service結合(防止activity被回收後執行緒也被回收)以及執行緒的數量

執行緒池使用可見java的執行緒池


  1. 快取

    java的物件建立需要分配資源較耗費時間,加上建立的物件越多會造成越頻繁的gc影響系統響應。主要使用單例模式、快取(圖片快取、執行緒池、View快取、IO快取、訊息快取、通知欄notification快取)及其他方式減少物件建立。

(1). 單例模式

對於建立開銷較大的類可使用此方法,保證全域性一個例項,在程式執行過程中該類不會因新建額外物件產生開銷。示例程式碼如下:

(2). 快取

程式中用到了圖片快取、執行緒池、View快取、IO快取、訊息快取、通知欄notification快取等。

  1. 圖片快取:見ImageCache和ImageSdCache


  2. 執行緒池:使用Java的Executors類,透過newCachedThreadPool、newFixedThreadPool、newSingleThreadExecutor、newScheduledThreadPool提供四種不同型別的執行緒池


  3. View快取:

    可見ListView快取機制

listView的getView快取



透過convertView是否為null減少layout inflate次數,透過靜態的ViewHolder減少findViewById的次數,這兩個函式尤其是inflate是相當費時間的


  1. IO快取:

    使用具有快取策略的輸入流,BufferedInputStream替代InputStream,BufferedReader替代Reader,BufferedReader替代BufferedInputStream.對檔案、網路IO皆適用。


  1. 訊息快取:透過 Handler 的 obtainMessage 回收 Message 物件,減少 Message 物件的建立開銷

    handler.sendMessage(handler.obtainMessage(1));


  1. 通知欄notification快取:下載中需要不斷改變通知欄進度條狀態,如果不斷新建Notification會導致通知欄很卡。這裡我們可以使用最簡單的快取

    Map notificationMap = new HashMap();如果notificationMap中不存在,則新建notification並且put into map.



(3). 其他

能建立基類解決問題就不用具體子類:除需要設定優先順序的執行緒使用new Thread建立外,其餘執行緒建立使用new Runnable。因為子類會有自己的屬性建立需要更多開銷。

控制最大併發數量:使用Java的Executors類,透過Executors.newFixedThreadPool(nThreads)控制執行緒池最大執行緒併發

對於http請求增加timeout


  1. Layout最佳化

    使用抽象佈局標籤(include, viewstub, merge)、去除不必要的巢狀和View節點、減少不必要的infalte及其他Layout方面可調優點,順帶提及佈局調優相關工具(hierarchy viewer和lint)。具體可見效能最佳化之佈局最佳化

TextView屬性最佳化:TextView的android:ellipsize=”marquee”跑馬燈效果極耗效能,具體原因還在深入原始碼中


  1. 資料庫最佳化

    主要包括索引和事務及針對Sqlite的最佳化。具體可見效能最佳化之資料庫最佳化


  1. 演算法最佳化

    這個就是個博大精深的話題了,只介紹本應用中使用的。

使用hashMap代替arrayList,時間複雜度降低一個數量級


  1. 延遲執行

    對於很多耗時邏輯沒必要立即執行,這時候我們可以將其延遲執行。

執行緒延遲執行 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(10);

訊息延遲傳送 handler.sendMessageDelayed(handler.obtainMessage(0), 1000);



四、本程式效能調優結果

  1. ViewPager左右滑動明顯示卡頓

  2. GridView上下滾動明顯示卡頓

    (1). 去掉TextView的android:ellipsize=”marquee”

(2). 修改圖片快取的最大執行緒數,增加http timeout

(3). 修改設定app是否已安裝的狀態,具體程式碼修改如下

  1. 其他Activity返回ViewPager Activity較慢

原文連結:http://www.apkbus.com/blog-667945-76774.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/964/viewspace-2812792/,如需轉載,請註明出處,否則將追究法律責任。

相關文章