我想这是一个蹩脚的问题,我甚至无法编造一个正确的主题!以下是我在Android下尝试做的事情:
public void onCreate(Bundle savedInstance) {
...
AskFilename ask = new AskFilename();
...
}
这里,AskFilename
类将显示一个用户界面,让用户输入文件名。但是,ask
方法返回后,onCreate()
对象将超出范围。所以这意味着将不再引用ask
(假设在AskFilename
类内,我没有将其this
指针指向任何其他变量),因此GC会更快或者之后,“收集”它。发生这种情况时,如果用户没有确定对话框,则AskFilename
中的代码已经不可用,因此系统将崩溃。我的理解是否正确?
(我想不出用这种想法来体验的方法,因为我不知道如何让GC完成它的工作。似乎GC只在它想要的时候开始!有没有办法制作它能完成它的工作吗?)
如果以上是正确的,那么新建UI相关对象的正确方法是什么?我知道我可以在AskFilename
静态内创建evry,或者我可以使ask
成为静态可变,并在完成后将其指定为null。但还有其他方法吗?或者,这个想法本身就是坏事?
(如果AskFilename是Activity的“内部”类,它会有什么不同吗?比如MyActivite.AskFilename。)
提前谢谢。
答案 0 :(得分:2)
首先,您可以将声明AskFilename ask;
放在方法声明之外,即作为您班级的成员。然后在onCreate方法中使用ask = new AskFilename();
初始化它。
然而,要知道的是你的构造函数可能看起来不那样。每个Android UI组件都包含对包含它的事物的回调(引用)。您通常通过将Context
传递给活动内部的UI组件的构造函数来执行此操作,上下文通常只是活动本身,因此您只需使用this
关键字。 e.g:
TextView tv = new TextView(this);
但是,您构建了AskFilename对话框,我希望您需要将Context传递给它的组件。所以你的构造函数可能需要使用Context参数:
ask = new AskFilename(this);
此外,您的Activity将(隐式)保存对其所有UI组件的引用,以及它与onCreateDialog()
显示的对话框因此GC不会提取您的对象。
它可以在调用setContextView或进行对话时获取这些引用。