Java 与UI相关的对象可以使用多久?

Java 与UI相关的对象可以使用多久?,java,android,Java,Android,我想这是个蹩脚的问题,我甚至连一个合适的题目都编不出来!以下是我在安卓系统下的尝试: public void onCreate(Bundle savedInstance) { ... AskFilename ask = new AskFilename(); ... } 在这里,AskFilename类将提供一个用户界面,让用户输入文件名。但是,一旦onCreate()方法返回,ask对象将超出范围。因此,这意味着不再有对ask的引用(假设在AskFilename类中,我

我想这是个蹩脚的问题,我甚至连一个合适的题目都编不出来!以下是我在安卓系统下的尝试:

public void onCreate(Bundle savedInstance) {
    ...
    AskFilename ask = new AskFilename();
    ...
}
在这里,
AskFilename
类将提供一个用户界面,让用户输入文件名。但是,一旦
onCreate()
方法返回,
ask
对象将超出范围。因此,这意味着不再有对
ask
的引用(假设在
AskFilename
类中,我没有将其
指针分配给任何其他变量),因此GC迟早会“收集”它。发生这种情况时,如果用户尚未确定对话框,则
AskFilename
中的代码已不可用,因此系统将崩溃。我的理解正确吗

(我想不出一种方法来体验这个想法,因为我不知道如何让GC完成它的工作。似乎GC只有在它想的时候才会启动!有没有一种方法可以让它完成它的工作?)

如果上面所说的是正确的,那么新的UI相关对象的正确方法是什么?我知道我可以使
AskFilename
中的每一个东西都是静态的,或者我可以使
ask
成为一个静态变量,并在完成时将其赋值为null。但是还有别的办法吗?或者,这个想法本身一开始就不好

(若AskFilename是活动的“内部”类,比如MyActivite.AskFilename,会有什么区别。)


提前谢谢。

首先,您可以将声明
作为文件名询问在方法声明之外,即作为类的成员。然后用
ask=newaskfilename()初始化它在onCreate方法中

然而,要知道的是,您的构造函数可能不会像这样。每个Android UI组件都包含一个回调(引用),指向包含它的对象。通常通过将
上下文
传递给UI组件的构造函数来实现这一点-在活动中,上下文通常只是活动本身,因此只需使用
this
关键字。e、 g:

TextView电视=新的TextView(本)

无论您如何构造AskFilename对话框,我希望您需要将上下文向下传递到其组件。因此,您的构造函数可能需要使用上下文参数:

 ask = new AskFilename(this);
此外,您的活动将包含对其所有UI组件的引用(隐式),以及它使用
onCreateDialog()
显示的对话框,因此GC不会拾取您的对象。
当您调用setContextView或创建对话框时,它会获取这些引用。

非常感谢!是的,就像你说的,我确实需要构造函数中活动的引用。为了便于讨论,这只保证AskFilename创建的每个UI视图都有对活动的引用,而不是AskFilename。也就是说,在这种情况下,askfilename仍然是一个孤儿(假设我没有像你建议的那样让
ask
成为活动的类成员,这对我来说确实有效)。我说得对吗?也许吧,但实际上,只有在调用setContentView(以某种方式)、将其附加到现有布局或通过将其创建为对话框使其显示时,才能使其显示在屏幕上,这两种方式都为活动提供了对对象的引用。