Android 記憶體優化程式碼篇總結
阿新 • • 發佈:2019-02-07
Android記憶體是個大塊,經常說到的是關於記憶體的使用和優化,這方面網上有很多經驗,本人就幾年的經驗和網路知識相結合,總結出以下條目:
一、static 和 final 的合理使用,給字串和常量加上這兩個關鍵字,他們會載入到靜態中,並且只加載一次,否則這個類開啟一次就載入一次,造成了資源的浪費;static修飾的一般是基本型別和輕量級物件,工具類方法,內部類等,一般不要修飾重量級集合等。
二、注意程式碼中的無關引用,比如在Activity中把Context設定為static,結果造成activity一直不能被回收,造成記憶體洩漏;或者一個單例模式的類需要傳入context,結果把activity傳了進去,也會造成記憶體洩漏,此時用getApplication()代替activity合適。
三、對於一些物件,為了安全起見,可以加入軟引用來控制,或者使用系統提供的LruCache快取。
四、Handler物件,適用於上一條,另一種情況,activity關閉時,Handler中還有訊息沒被執行,此時可以呼叫handler.removeCalllBacksAndMessages(null);方法,取消所有未被執行的訊息。Handler中發信息,Message不要直接new,而要複用。
五、Bitmap 大胖子,縮放時可以使用Options中的insampleSize屬性,不用載入就可以知道寬和高;Bitmap要快取,防止不停地建立,在新api中,bitmap在堆中,置空即可,但老的版本中,還是要先recycle(),然後再置空。
六、使用資料庫,要用到遊標,Cursor使用完後要及時關閉。I/O流也是同樣道理,使用完後要關閉。
七、佈局設定背景時,如果是純色,直接用color;規則的圖形,用shape;再複雜點的可以使用9path;最糟糕的情況,前三種都不符合需求,那麼就用圖片,只針對主流的三個包切圖就好。
八、ListView和GridView使用,一定要item快取;介面卡getView()中,針對某個view設定點選事件時,要防止直接new OnClickListener()這種寫法,頁面滑動回來,就重新new一個物件設定進去,造成不必要的浪費。在自定義View時,onDraw()方法裡,避免 new Paint(),沒重新整理一次介面就new一次物件。
九、廣播記得要控制好生命週期,及時解綁,否則會造成記憶體洩漏;Service用完後要及時停止銷燬,可用IntentService來代替Service。
十、執行緒問題,當需要大量的子執行緒時,毫無疑問要選擇使用執行緒池。
十一、字串的大量拼接問題,使用StringBuilder代替String。
十二、列舉比較消耗資源,能省則省。
十三、常用集合的選擇,ArrayList和LinkedList的選擇,如果重查詢,用ArrayList,如果重在增刪,則用LinkedList。遍歷物件,ArrayList首選常規for迴圈,LinkedList首選迭代器。
十四、使用Lint檢查程式碼。