2011-04-07 93 views
2

兩天前我注意到了一些東西。我對地圖活動有一個微調。在活動的OnCreate()方法中,我使用數據填充微調器。之後,我開始在DDMS中的堆分析器,我開始打開/關閉微調器。當我打開微調項時,我注意到虛擬機分配內存,但是當我關閉它時,虛擬機不釋放這個內存。我試圖啓動GC,但內存仍然分配。我一個接一個地做了20次,分配的內存從3.5MB增加到7MB。哪裏不對?我在谷歌組中發現了一個問題,但他們還沒有回答。
Spinner memory leakAndroid - 內存泄漏還是?

我重寫了所有我的代碼在微調適配器,但問題仍然存在。 我讀了一些意見這個話題

Avoid memory leaks

中也有一些是我沒得到:

當可提拉連接到一個視圖,該視圖設置爲在繪製的回調。在上面的代碼片段中,這意味着drawable引用了TextView,它本身具有對活動的引用(Context),它依次引用任何東西(取決於您的代碼)。

什麼這是什麼意思?如果我有一個textview並將其設置爲可繪製對象(我注意到drawable是靜態的),textview對象具有對可繪製對象的引用,並且可繪製對象也具有對該視圖的引用?如果這是真的,他們變得不可被GC破壞,因爲他們都有彼此的引用。什麼是這些對象之間的回參考(回調)依賴關係?

+0

沒有得到,要麼tbh – 2017-01-14 09:07:32

回答

18

抱歉,我不能幫助你的微調的問題,但我可以在第二部分一試:

在Android開發者博客羅曼蓋伊後解釋兩個重要的事情。

第一:

當您創建一個視圖(TextView的,ImageView的......),你不能與活動場景

// DO NOT DO THIS 
TextView label = new TextView(this); 

創建它,否則查看到您的活動的參考和意志永遠不會被釋放。

相反,當您創建一個視圖編程,你必須使用應用程序上下文:

TextView label = new TextView(getApplicationContext()); 

二:當您鏈接被拉伸到一個視圖

,它不斷回調您的活動通過上下文。如果你離開它,當你的活動被破壞時它會泄漏內存。

做,以避免這種事情是這樣的例子蒙山一個ImageView的到「活動時被銷燬設置存儲可繪回調空」:

protected void onDestroy() { 
    imageView.getDrawable().setCallback(null); 
    super.onDestroy(); 
} 

你要做的背景相同可繪製...

希望它有幫助。

+0

驚訝這沒有得到upvoted足夠的。 – sdfwer 2012-05-11 14:27:47

+1

「當您將Drawable鏈接到視圖時,它會通過上下文對您的活動進行回調。」 ---> ***這是不正確的***。回調是在視圖上。 (它實現Drawable.Callback接口的視圖不是活動) – 2013-05-12 22:58:32

+0

@ol_v_er您能分享羅曼蓋伊解釋這個的鏈接嗎? – 2016-03-23 12:38:55