1. 程式人生 > >Android記憶體洩漏(執行緒造成的記憶體洩漏與資源未關閉造成的記憶體洩漏)

Android記憶體洩漏(執行緒造成的記憶體洩漏與資源未關閉造成的記憶體洩漏)

一.執行緒造成的記憶體洩漏

對於執行緒造成的記憶體洩漏,也是平時比較常見的leakCanary官方Demo就是執行緒成造成的記憶體洩漏,使用了AsyncTask去執行非同步執行緒,現在我們換個寫法,直接使用Thread:

1. 新建工程,配置好leakCanary環境

2. 直接在MainActivity新增如下程式碼:

紅色方框內的程式碼,可能每個人都這樣寫過。

OK ,我們執行一下,然後做如下操作:

1 MainActivity頁面開啟後,在20秒內點選手機返回鍵

2. 等待10秒

操作完成,leakCanary檢測出記憶體洩漏。

分析原因:和上面幾個案例的原因類似,不知不覺又搞了一個匿名內部類Runnable,

對當前Activity都有一個隱式引用。如果Activity在銷燬的時候Runable內部的任務還未完成, 那麼將導致Activity的記憶體資源無法回收,造成記憶體洩漏。正確的做法還是使用靜態內部類的方式,如下:

上面程式碼中,自定義了靜態的內部類MyRunable,實現了Runable ,然後在使用的時候例項化它。

執行程式碼後做如上相同操作,發現leakCannary沒有檢測出記憶體洩漏。

二. 資源未關閉造成的記憶體洩漏

對於使用了BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等資源的程式碼,應該在Activity銷燬時及時關閉或者登出,否則這些資源將不會被回收,造成記憶體洩漏。

總結

以上Android開發中常見的記憶體洩漏問題及解決辦法,能對記憶體洩漏有一定的認識和見解,是同學們面試時的一個極其有利的加分項,記憶體洩漏是很多有一定開發經驗的程式設計師都會犯的錯誤,掌握這些,代表你確確實實做過一些東西,並有一定的總結。