android記憶體效能的優化
UI
佈局優化,減少佈局巢狀的層次。
選擇效能低的viewgroup,linearlayout,framelayout優先於relativelayout。
使用viewstub,include標籤。可以按需繪製、減少gpu壓力、佈局複用 。
在view的ondraw方法中減少操作,尤其是區域性變數和耗時的操作。
記憶體洩漏
儘量少使用靜態變數,已經沒有邏輯關聯的變數及時銷燬置空。
資源的關閉:例如資料庫 webview的銷燬 bitmap的管理。
活在Activity
生命週期之外的執行緒。沒有清空對Activity
的強引用
Handler定義匿名的Runnable
,用匿名類Handler
Runnable
內部類會持有外部類的隱式引用,被傳遞到Handler
的訊息佇列MessageQueue
中,在Message
訊息沒有被處理之前,Activity
例項不會被銷燬了,於是導致記憶體洩漏。
可以用LeakCanary和mat工具來幫助檢測專案中的問題。
響應速度優化
避免在主執行緒中做耗時操作,Activity如果5秒鐘之內無法響應觸控事件或輸入事件會ANR,BroadcastReceiver10秒鐘之內還未執行完操作也會出現ANR。但是這類錯誤不太好復現和dubug,所以當一個程序發生了ANR之後,系統會在/data/anr目錄下建立一個檔案traces.txt,通過分析這個檔案就能定位出ANR的原因。
bitmap
有四種載入方式:decodeFile,decodeResource,decodeStream和decodeByteArray
1、BitmapFactory.Options引數,即取樣率。通過對inSampleSize的設定,對圖片的畫素的高和寬進行縮放。應該總是2的指數,如1,2,4,8等。如果外界傳入的inSampleSize的值不為2的指數,那麼系統會向下取整並選擇一個最接近2的指數來代替。比如5,系統會選擇4來代替。
2、inJustDecodeBounds引數,通過inJustDecodeBounds=true,然後載入圖片就可以實現只解析圖片的寬高資訊,並不會真正的載入圖片。當獲取了寬高資訊,計算出縮放比後,然後在將inJustDecodeBounds=false,再重新載入圖片,就可以載入縮放後的圖片
ListView/RecycleView
1、使用ViewHolder模式來提高效率
2、非同步載入:耗時的操作放在非同步執行緒中
3、ListView/RecycleView的滑動時停止載入和分頁載入
其他效能優化
避免過度建立物件、過度使用列舉,列舉佔用的記憶體空間佷大、常量請使用static final來修飾、適當採用軟引用和弱引用
、採用記憶體快取和磁碟快取。