2012-05-18 73 views
5

這裏是一塊簡化代碼:這是Android上下文泄漏嗎?

static Activity longLivedField; 

onCreate(...) {  
    longLivedField = this; // the only write to this field 
} 

我見過的人聲稱這是一個方面泄漏,併爲它創建的修復。典型的解決方法是在適當的地方取消該字段。例如,在onPause()

onPause() { 
    longLivedField = null; 
} 
+0

你這樣做是爲了保持不同情境下? – accordionfolder

+0

是的。有建議說我們不應該這樣做,而是使用getApplicationContext()來代替。但我只想了解爲什麼這樣做會成爲一個問題。 – dacongy

回答

3

是的,這是一個內存泄漏,如果你不廢掉領域中的onPause()。你幾乎肯定不想保留對任何Activity的靜態引用。你試圖達到什麼目標?

Android開發者網站包含描述如何避免像這樣的內存泄漏一個方便的網頁:

Avoiding Memory Leaks

+0

我曾經多次閱讀過這篇文章。不過,區別在於,在該示例中,靜態字段僅寫入一次。但是在這個例子中,每次創建新的活動對象時都會寫入靜態字段(當然,實際上調用onCreate()時),因此舊字段(應該泄露的字段)不是從靜態字段可以更長時間地到達。所以它似乎只能在很短的時間內泄漏,這大概是在onPause()和onCreate()中的賦值之間。 – dacongy

+2

這是真的,但當用戶移動到不同的活動時會發生泄漏。靜態字段將指向您的活動的最後一個實例,從而泄漏。 –

+1

下面是我對你的答案的理解,如果我錯了,請糾正我的錯誤:目標是當用戶移動到不同的活動時,垃圾收集活動的最後一個實例成爲可能。這樣做很重要,因爲一個活動的整個GUI層次結構(我想明確地說,因爲多個活動或多個應用程序中的泄漏顯然是有害的)可能會消耗相當大量的內存。這樣做是合理的,因爲垃圾收集和對象分配的效率足以快速收集和分配GUI層次結構。 – dacongy