这会导致内存泄漏吗?

时间:2010-08-03 18:58:25

标签: android

以下代码是否会导致内存泄漏?基本上我使用setContentView()在我的应用程序中的各种布局之间切换,并且我的活动的成员变量维护对布局上的各种视图(按钮/ textviews ...)的引用。

我认为如果活动类具有对按钮的引用然后更改布局,则布局不会被垃圾收集,因为它仍然会保留按钮引用吗?如果是这种情况,我可以在更改布局之前将null变量置空吗?

感谢。

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 .. //
    }

}

3 个答案:

答案 0 :(得分:1)

在更改任何布局之前,您需要将按钮设置为null。

答案 1 :(得分:0)

我不相信应该导致内存泄漏。更改布局不会破坏活动,因此活动仍然可以控制绑定的引用。一旦活动被销毁,所有内存都应该被清除。此外,如果您切换的布局太多,您可能需要考虑使用单独的活动。

答案 2 :(得分:0)

R.layout.main的视图(你在OnCreate中初始分配)只要你持有startBtn引用或只要你的活动的实例是活着的,就不会变成垃圾。无论哪种方式,它看起来不像潜在的内存泄漏。只需确保在设置新布局时释放对视图的引用。另一件需要考虑的事情是使用WeakReference来包装对布局视图的引用(这适用于复杂的设计)。这样,只要您的布局不再附加到活动(没有对视图的强引用),即使您通过WeakReference引用它们,所有视图也可以成为一个大小。