2010-08-03 82 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引用它们,所有视图也可以成为一个布景。