我想这是一个la脚的问题,我什至无法弥补一个适当的问题!这是我要在Android下执行的操作:
public void onCreate(Bundle savedInstance) {
...
AskFilename ask = new AskFilename();
...
}
在这里,
AskFilename
类将显示一个用户界面,让用户输入文件名。但是,一旦ask
方法返回,onCreate()
对象将超出范围。因此,这意味着不再有对ask
的引用(假设在AskFilename
类中,我没有将其this
指针分配给任何其他变量),因此GC迟早会“收集”它。发生这种情况时,如果用户尚未确定对话框,则AskFilename
中的代码已不可用,因此系统将崩溃。我的理解正确吗?(我想不出用这种方法进行实验的方法,因为我不知道如何使GC发挥作用。似乎GC仅在需要时才起作用!有没有办法使它完成它的工作?工作?)
如果以上内容正确,那么新建与UI相关的对象的正确方法是什么?我知道我可以将
AskFilename
内部的evrything设为静态,或者可以将ask
设为静态的vairable并在完成后将其分配为null。但是还有其他方法吗?或者,这个想法本身首先是不好的?(如果AskFilename是Activity的“内部”类,这有什么区别吗?例如MyActivite.AskFilename。)
先感谢您。
最佳答案
首先,您可以将声明AskFilename ask;
放在方法声明之外,即作为类的成员。然后,在onCreate方法中使用ask = new AskFilename();
对其进行初始化。
但是,要知道的是,您的构造函数可能看起来不会像那样。每个Android UI组件都包含一个对包含它的事物的回调(引用)。通常,您可以通过将Context
传递给UI组件的构造函数来实现-在Activity内,上下文通常只是Activity本身,因此只需使用this
关键字。例如:TextView tv = new TextView(this);
但是,无论您构建AskFilename对话框,还是希望将Context传递给其组件。因此,您的构造函数可能需要使用Context参数:
ask = new AskFilename(this);
此外,您的“活动”将(隐式)保留对其所有UI组件的引用,并使用
onCreateDialog()
显示对话框,因此GC将不会拾取您的对象。当您调用setContextView或进行对话框时,它将获取这些引用。