UI相关对象可以使用多长时间?

时间:2011-02-10 20:46:15

标签: java android

我想这是一个蹩脚的问题,我甚至无法编造一个正确的主题!以下是我在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。)

提前谢谢。

1 个答案:

答案 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或进行对话时获取这些引用。