我想这是一个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或进行对话框时,它将获取这些引用。

09-11 19:32