以下代码是否会导致内存泄漏?基本上我使用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 .. //
}
}
答案 0 :(得分:1)
在更改任何布局之前,您需要将按钮设置为null。
答案 1 :(得分:0)
我不相信应该导致内存泄漏。更改布局不会破坏活动,因此活动仍然可以控制绑定的引用。一旦活动被销毁,所有内存都应该被清除。此外,如果您切换的布局太多,您可能需要考虑使用单独的活动。
答案 2 :(得分:0)
R.layout.main的视图(你在OnCreate中初始分配)只要你持有startBtn引用或只要你的活动的实例是活着的,就不会变成垃圾。无论哪种方式,它看起来不像潜在的内存泄漏。只需确保在设置新布局时释放对视图的引用。另一件需要考虑的事情是使用WeakReference来包装对布局视图的引用(这适用于复杂的设计)。这样,只要您的布局不再附加到活动(没有对视图的强引用),即使您通过WeakReference引用它们,所有视图也可以成为一个大小。