2013-10-21 38 views
3

我寫了一個非常標準的Android應用程序,它在GridView中顯示一堆圖片(來自聯繫人)。應用程序沒有做任何特別的事情來嘗試在屏幕方向更改上保留數據,並且在重新創建活動時重新創建GridView,適配器和加載器。內存泄漏方向更改

但是,在一些方向改變後,應用程序變慢;再過幾次之後,它會崩潰,出現內存不足錯誤(在BitmapFactory.decodeStream()處)。如果我讓它在旋轉之間靜坐一分鐘,讓垃圾收集器做它的事,這仍然會發生。

我的印象是,當方向變化時Acitivty被破壞時,Android會釋放所有與Activity相關的內存。但是,這似乎並非如此。我的問題是:儘管存在活動破壞,我可以無意中保留哪些內存?

(請注意,應用程序運行正常,只要它不會受到太多的方向變化,所以要儘量減少內存的一般方法,我使用是足夠的。)

+0

通常,這是通過使用成位圖靜態引用或通過將活性上下文其保持它的一個引用一些其它類引起的。你在做這樣的事嗎?發佈onCreate()和onResume()會有所幫助。 MAT會告訴你什麼沒有被收集。 PS。垃圾收集工作得很好。 – Simon

+0

看看這個和我關於解綁定drawables的答案。 http://stackoverflow.com/questions/14759601/proper-ondestroy-how-to-avoid-memory-leaks/14759756#14759756 – Simon

+0

@Simon:謝謝!我認爲你是對的:我按照http://developer.android.com/training/contacts-provider/display-contact-badge.html使用非靜態內部類作爲ViewHolder。但是,正如我現在理解的那樣,其中的意見將保留參考文獻的背景。我會試着將這個作爲一個靜態的內部類來重寫,看看會發生什麼。我也研究過我的onCreate和onResume,但我不認爲這裏有什麼有趣的地方。如果我知道如何在onDestroy中輕鬆地從GridView中提取屏幕位圖,我會明確地解除它們。 –

回答

1

我想你忘記了添加bitmap.recycle();

而且簡單的方法解決這個問題,添加到AndroidManifest,活性參數:android:configChanges="orientation|screenSize"

+0

這種攻擊會如何發生,即使Google說只能用作最後的手段,修復內存泄漏? – Simon

+0

活動不會被重新創建,這意味着位圖不會被創建,並且會使用舊的。你可以避免這種情況,如果將使用**回收**方法,就像上面的 – artemiygrn

+0

這個活動將在更多的場景中被重新創建,而不僅僅是改變方向。所有這一切都是隱藏錯誤。你添加這個,改變屏幕並且不會崩潰。但該錯誤仍然存​​在。現在嘗試插入汽車塢站,或將應用程序置於後臺並接聽電話,或更改區域等。這是一種破解問題的黑客行爲。 – Simon