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(以某种方式)、将其附加到现有布局或通过将其创建为对话框使其显示时,才能使其显示在屏幕上,这两种方式都为活动提供了对对象的引用。