1. 程式人生 > >android記憶體效能的優化

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來修飾、適當採用軟引用和弱引用

、採用記憶體快取和磁碟快取。