2012-06-27 129 views
2

在這篇文章中的Android getApplicationContext內存管理

When to call activity context OR application context?

馬克·墨菲說

「它可以創建內存泄漏,如果從getApplicationContext()的上下文保存到通過它您的通話創造的東西,你不需要清理,如果一個Activity持有某些東西,一旦Activity被垃圾收集,其他的東西也會被刷新,Application對象會保留在你的進程的整個生命週期中。

什麼調用創建應用程序上下文保持的東西?

我有一個庫需要一個上下文的各種東西。它可以在後臺運行並跨越活動,但使用和更新活動上下文會有問題。

我認爲這可能是使用應用程序上下文更適合的場合之一?

+0

是的..使用應用程序上下文。 – Blundell

回答

1

如果庫中對象的生命週期可以跨越多個活動,那麼絕對使用應用程序上下文。使用活動上下文可防止垃圾收集器將上下文丟棄。由於活動上下文可以保存相當多的數據,因此內存使用量可能會急劇增加。

另外,如果一個活動被關閉,它會放棄它的窗口標記。試圖用這種上下文產生對話將給出BadTokenException。因此,如果對象不直接與活動生命週期相關聯,則將活動上下文提供給對象是沒有意義的。

編輯:Here is a credible source

+0

這就是我正在考慮使用getApplicationContext的原因,它更容易控制而不是跨活動管理上下文,但真的想現在如何(如果?)在應用程序上下文的場景中泄漏內存是可能的? – Cullan

+0

如果庫某種程度上取決於上下文在某個時刻失效,或者庫中存在使內存在上下文的整個生命週期中存在錯誤的唯一額外風險。 – pgsandstrom

+0

請允許我澄清一下:圖書館可能會將上下文引用。如果是這樣的話,那麼只要有上下文,它就會留在記憶中。但是,這對圖書館來說是非常糟糕的設計。 – pgsandstrom

0

我在我的一個圖書館項目中遇到同樣的問題。

即使在庫項目中,也推薦使用活動上下文。有很多組件只需要活動上下文。例如:對話框。因此,我的建議是將活動上下文從項目傳遞到庫項目。

雖然應用程序上下文可以保存庫項目中的序列化問題。

+0

對不起,應該在原始問題中說過,庫中沒有GUI組件。 – Cullan

+0

比你應該應用上下文。 – vineet