常見的記憶體洩漏以及如何解決它們
1.修復你的背景:
嘗試使用適當的上下文:例如,因為 Toast 可以在許多活動中看到而不是隻有一個,所以使用 getApplicationContext()
進行 toast,並且即使活動已經結束,服務也可以繼續執行,啟動服務:
Intent myService = new Intent(getApplicationContext(), MyService.class);
使用此表作為適當的上下文的快速指南:
2.對 Context 的靜態引用
嚴重的記憶體洩漏錯誤是保持對 View
的靜態引用。每個 View
都有一個 Context
的內部參考。這意味著在應用程式終止之前,不會對具有整個檢視層次結構的舊 Activity 進行垃圾回收。旋轉螢幕時,你的應用程式將在記憶體中使用兩次。
確保絕對沒有靜態引用 View,Context 或它們的任何後代。
3.檢查你是否真正完成了服務
例如,我有一個使用 Google 位置服務 API 的 intentService。我忘了呼叫 googleApiClient.disconnect();
:
//Disconnect from API onDestroy()
if (googleApiClient.isConnected()) {
LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, GoogleLocationService.this);
googleApiClient.disconnect();
}
4.檢查影象和點陣圖的用法:
如果你使用 Square 的庫 Picasso 我發現我沒有使用 .fit()
洩漏記憶體,這大大減少了我的記憶體佔用平均從 50MB 到小於 19MB:
Picasso.with(ActivityExample.this) //Activity context
.load(object.getImageUrl())
.fit() //This avoided the OutOfMemoryError
.centerCrop() //makes image to not stretch
.into(imageView);
5.如果你使用廣播接收器,請取消註冊
6.如果你使用 java.util.Observer
(觀察者模式):
一定要使用 deleteObserver(observer);