2015-12-02 38 views
0

在這個官方的博客網站,我看了下面的內存泄漏示例。關於android內存泄露

http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html

private static Drawable sBackground; 
@Override 
protected void onCreate(Bundle state) { 
    super.onCreate(state); 
    TextView label = new TextView(this); 
    label.setText("Leaks are bad"); 
    if (sBackground == null) { 
    sBackground = getDrawable(R.drawable.large_bitmap); 
    } 
    label.setBackgroundDrawable(sBackground); 
    setContentView(label); 
} 

引述原崗位「這個代碼是非常快,也非常錯誤的;它泄漏在第一屏幕方向變化所造成的第一個活動時可抽拉連接到一個視圖,在上面的代碼片段中,這意味着drawable有一個對TextView的引用,它本身有一個對活動的引用(Context),它依次引用幾乎所有的東西(取決於)「

我不明白這個部分。在重新創建活動時,將執行onCreate()方法,靜態Drawable對象sBackground將被附加到第二個活動中的新TextView。這意味着對象sBackground將引用新文本視圖而不是第一個活動中的舊文本視圖,從而使第一個活動未引用。

有人能告訴我我的推理哪裏錯了嗎?在此先感謝~~

哎呀,看來這個線程是重複的,有人問正是這裏
Understanding memory leaks in Android application 對不起同樣的事情,我太粗心。

+0

getDrawable(R.drawable.large_bitmap)保留參考 –

回答

0

據我所知,在檢查View類的源代碼後,當一個Drawable附加到一個視圖上時,該視圖被設置爲drawable上的回調。除此之外,該視圖還保留對該Drawable的引用。請參閱此鏈接http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/view/View.java#16292。 由於靜態變量具有較長的生命週期,因此每次重新創建活動&時都會將Drawable設置爲其視圖,該活動及其上下文也會保留對靜態Drawable的引用。然後,只要變量做了就記憶。