2010-08-03 80 views
0

下面的代碼會導致內存泄漏嗎?本質上,我使用setContentView()在應用程序之間切換各種佈局,並且我有活動的成員變量,它們維護對佈局上各種視圖(按鈕/文字視圖...)的引用。這會造成內存泄漏嗎?

我正確地認爲,如果活動類有一個按鈕的引用,然後更改佈局佈局不會被垃圾回收,因爲它仍然會保存按鈕引用?如果是這種情況,我可以在更改佈局之前將按鈕變量清空嗎?

謝謝。

public class MyApp extends Activity { 

    private Button startBtn; 

    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

    // Set main layout 
    setContentView(R.layout.main); 

    startBtn = (Button) findViewById(R.id.startBtn); 
    startBtn.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
       doStart(); 
      } 

     }); 
    } 

    private void doStart() 
    { 
     // Change to starting screen layout 
     setContentView(R.layout.begin); 

     /// .. Work with more views here and change layouts in a bit .. // 
    } 

} 

回答

0

我不相信會導致內存泄漏。更改佈局不會破壞活動,所以活動仍然可以控制綁定的參考。一旦活動被破壞,所有的記憶應該被清除。另外,如果您要切換佈局,您可能需要考慮使用單獨的活動。

1

您將希望在更改任何佈局之前將按鈕設置爲空。

0

只要您的活動實例處於活動狀態,只要您持有startBtn引用或者R.layout.main(您最初在OnCreate中分配)的視圖不會變成垃圾。無論哪種方式,它看起來不像是一個潛在的內存泄漏。只需確保在設置新佈局時釋放對視圖的引用。還有一件要考慮的事情是使用WeakReference將引用包裝到佈局的視圖中(這對於複雜的設計來說)。這樣,只要佈局不再附加到活動(沒有強引用視圖),即使您通過WeakReference引用它們,所有視圖也可以成爲一個佈景。