我正在研究一個應用程序,其中90%的活動從普通活動繼承並且所有這些活動都泄漏,這意味着如果我從A->B
開始,然後從B->A
( finish()
被稱爲),B
的onDestroy()
被調用,但它仍然泄漏(與MAT檢查)。內存泄漏 - android.os.Message舉辦的Android活動
泄露的活動相當大(10MB〜),所以在來回幾次後,應用程序與OOM崩潰。
我檢查堆轉儲和遵循的路徑GC根所對泄漏的活動,他們都看起來像這樣:
所以我想它的東西在滲漏真實的通用超類。我已經檢查過,當活動被破壞時,所有的BroadcastReceivers和監聽器都是未註冊的,並且沒有使用Handler
,也沒有可能導致泄漏的匿名內部類(至少在我看來)。
什麼可能是泄漏的原因?任何幫助將非常感激。
編輯
我發現有兩段代碼,當註釋掉活動不漏了:
- 是實例化一個
ProgressDialog
一些代碼行。 - 致電
postDelayed
與匿名Runnable
。
在第一種情況下,對話框的dismiss()
函數在銷燬之前調用,所以我不知道爲什麼這可能是問題所在。在第二種情況下,在中調用Runnable
的removeCallbacks,因此理論上它已被正確清理,不是嗎?
乾杯。
我的第一個鏡頭是一個匿名或內部類,它保留對活動上下文的引用。發佈您的活動代碼,以便我們看看它。 –
不幸的是我不能透露代碼,它非常龐大而且很混亂。 MAT截圖告訴你什麼? – Pin
它告訴我你正在泄漏上下文並且它正在被消息隊列保存。首先,驗證活動中是否存在任何非靜態的內部類。來自非靜態內部類的對象持有對其父項的引用,因此您可能需要仔細檢查它。同時仔細檢查您發佈的runnable:運行時間是否過長?只要它在消息隊列中,活動的上下文就不會被破壞。 –