標籤:
效能最佳化:布局最佳化、繪製最佳化、記憶體流失最佳化、響應速度最佳化、ListView最佳化、Bitmap最佳化、線程最佳化等
1.布局最佳化思想:盡量減少布局的層級,繪製工作量少,效能高操作:1.刪除布局中無用的控制項和層級 2. 選擇使用效能低的ViewGroup,比如LinearLayout、FrameLayout,RelativeLayout功能複雜,優先使用前兩者 3.採用<include>標籤、<merge>標籤和ViewStub。<include>標籤主要用於布局重用,<merge>標籤一般和<include>標籤配合使用,它可以降低減少布局的層級ViewStub提供了按需載入的功能,繼承了View,非常輕量級且寬高都是0,本身不參加任何的布局和繪製過程。
2.繪製最佳化思想:繪製最佳化是指View的onDraw方法要避免執行大量的操作。操作:1.onDraw中不要建立新的局部對象,這是因為onDraw方法可能會被頻繁調用,這樣就會在一瞬間產生大量的臨時對象,這不僅僅佔用了過多的記憶體而且還會導致系統更加頻繁GC,降低了程式的執行效率。 2.onDraw方法中不要做耗時的任務,也不能執行成千上萬次的迴圈操作。
3.記憶體泄露最佳化1.避免寫出有記憶體流失的代碼2.通過一些分析工具比如MAT來找出潛在的記憶體流失繼而解決。出現情境:1.靜態變數導致的記憶體流失2.單例模式導致的記憶體流失3.屬性動畫導致記憶體流失:android3.0之後的屬性動畫,無限迴圈播放需要在onDestroy中調用animator.cancel()停止動畫Android記憶體流失:1.資來源物件沒關閉造成的記憶體流失2.構造Adapter時,沒有使用緩衝的convertView3.Bitmap對象不在使用時調用recycle()釋放記憶體4.試著使用關於application的context來替代和activity相關的context5.註冊沒取消造成的記憶體流失6.集合中對象沒清理造成的記憶體流失
4.響應速度最佳化與ANR日誌分析響應速度最佳化的核心思想是避免在主線程中做耗時操作,採用非同步方式執行耗時操作。比如在主線程中做了非常耗時的操作,比如說是下載,io異常等 潛在的耗時操作,例如網路或資料庫操作,或者高耗時的計算如改變位元影像尺寸,應該在子線程裡(或者以資料庫操作為例,通過非同步請求的方式)來完成
Activity如果5 s之內無法響應螢幕觸摸事件或者鍵盤輸入事件,就會出現ANRbroadcastReceiver 10s之內還沒執行完操作就會出現ANR
當一個進程發生ANR之後,系統會在/data/anr目錄下建立了一個檔案traces.txt
第二:如何避免ANR?1、運行在主線程裡的任何方法都儘可能少做事情。特別是,Activity應該在它的關鍵生命週期方法(如onCreate()和onResume())裡儘可能少的去做建立操作。(可以採用重新開啟子線程的方式,然後使用Handler+Message的方式做一些操作,比如更新主線程中的ui等
2、應用程式應該避免在BroadcastReceiver裡做耗時的操作或計算。但不再是在子線程裡做這些任務(因為 BroadcastReceiver的生命週期短),替代的是,如果響應Intent廣播需要執行一個耗時的動作的話,應用程式應該啟動一個 Service。(此處需要注意的是可以在廣播接受者中啟動Service,但是卻不可以在Service中啟動broadcasereciver,關於原因後續會有介紹,此處不是本文重點)
3、避免在Intent Receiver裡啟動一個Activity,因為它會建立一個新的畫面,並從目前使用者正在啟動並執行程式上搶奪焦點。如果你的應用程式在響應Intent廣 播時需要向使用者展示什麼,你應該使用Notification Manager來實現
總結:anr異常也是在程式中自己經常遇到的問題,主要的解決辦法自己最常用的就是不要在主線程中做耗時的操作,而應放在子線程中來實現,比如採用Handler+mesage的方式,或者是有時候需要做一些和網路相互互動的耗時操作就採用asyntask非同步任務的方式(它的底層其實Handler+mesage有所區別的是它是線程池)等,在主線程中更新UI。
5.ListView和Bitmap最佳化ListView最佳化:首先採用ViewHolder並避免在getView中執行耗時操作其次根據列表的滑動狀態來控制任務的執行頻率最後可以嘗試開啟硬體加速來使ListView的滑動更加流暢
Bitmap最佳化:主要通過BitmapFactory.Options來根據需要對圖片進行採樣。
6.線程最佳化採用線程池,避免程式中存在大量的Thread
7.一些效能最佳化建議避免建立過多的對象不要過多使用枚舉,枚舉佔用的記憶體空間要比整型大常量使用static final來修飾使用一些Android特有的資料 結構,比如SparseArray和Pair等,他們有更好的效能。適當使用軟引用和弱飲用採用記憶體緩衝和磁碟緩衝盡量採用靜態內部類,這樣可以避免潛在的由於內部類而導致的記憶體流失
記憶體泄露分析之MAT工具分析泄露問題
Android效能最佳化