RT,在android開發中,如果在使用context的地方全部用getApplicationContext()會不會避免某些內存泄漏問題?


好巧,本人Android小小白,剛學到這裡,也有些不懂,搜索了好多資料,自己剛好碼了一篇關於題主所說的博文,給大家分享一下我的一點點想法吧,若有錯誤,請大家指出,萬分感激!!首先,Activity的Context和Application的Context肯定不是一個東西,一個是當前活動的
Context,它的生命周期僅限於此活動,一個是整個應用程序的Context,它的生命周期伴隨著整個程序,鑒於Activity的Context的
特點,濫用它往往會造成內存泄露,如下代碼所示:

public class TestContext{
private static TestContext testContext;
private Context context;

private TestContext(Context context){
this.context = context;
}

public static synchronized TestContext getInstance(Context context){
if(null == testContext)
testContext = new TestContext(context);
return testContext;
}
}

顯而易見,上述單例模式中textContext是強引用static類型,往往它的生命周期伴隨著整個應用程序,但你傳
遞進來的Context若是一個Activity的,只要我們這個應用程序還活著,它就沒有辦法正常的回收,這就造成了內存的泄露。解決的方法很簡單,將
初始化TestContext是傳遞的參數context變為context.getApplicationContext()既可,因為用此方法獲得的是應用程序的
context,因此就不用擔心內存泄露了。既然如此的話,在能使用context的地方全部替換context.getApplicationContext()不就皆大歡喜了嗎?很遺憾的來
說,這樣不行,因為他們根本不是一個東西,它們的應用場景是不同的,並非所有的Activity的Context的場景,Application的
Context依然可以,一下是我總結出來的一個表格,表示了它倆之間的應用場景:

其實我們只要把握住兩條原則即可:

1.凡是和UI相關的,都不建議使用Application的Context.

2..不要讓生命周期長的對象引用activity context,即保證引用activity的對象要與activity本身生命周期是一樣的,若不一樣,請考慮一下是否可以使用Application的Context.


開發中的一個原則,誰創建,誰釋放,嚴格遵循,就基本不會發生內存泄露

另外,不可能全部使用applicationContext的

使用context的地方全部用getApplicationContext()的確是可以避免在某些情況Activity被hold住從而導致釋放不了的問題,而且像Activity這種內存泄漏也是很難被發現。但是並不能所有的Context都全部使用getApplicationContext(),比如你創建Dialog構造函數傳遞進去的Context一定要是Activity,否則就會出錯;還有就是你需要調用到Activity本身提供的方法等等情況。

所以,可以使用getApplicationContext()就不要使用Activity。同時,也需要在寫代碼的時候提高對內存泄漏的敏感度,盡量去避免發生內存泄漏!


首先,getApplicationContext確實能在一定程度上減少內存泄露。但是,不可能在需要Context的地方全部使用getApplicationContext。大體的原則是跟UI相關的用Activity,其它用getApplicationContext。
安卓的 Activity設計很怪異,生存周期難以控制,有時候一個 Activity會被創建、銷毀多次,同時存在多個Activity實例的情況也有。所以不能依賴Activity管理資源,只能將Activity看做一個視圖,本身不維護業務狀態。否則就會出現各種難纏的狀況。使用getApplicationContext,也是同樣的效果,可以使程序盡量不在Activity管理資源和業務狀態。所以樓主的提法,靠譜。

Android學習系列(36)--App調試內存泄露之Context篇(上)

見過的講的比較好的一篇博客

特別是System Service對象 是很容易不小心造成句柄泄露的另外推薦leakcanary工具,能很容易的檢測到句柄泄露,相關的資料可自行搜索,網上很多
只要管理的好傳什麼都無所謂,當然優先使用getApplicationContext。


推薦閱讀:
相关文章