java - UI 相关对象可以保持可用多久?

标签 java android

我想这是一个蹩脚的问题,我什至都无法编出一个合适的主题!这是我在 Android 下尝试执行的操作:

public void onCreate(Bundle savedInstance) {
    ...
    AskFilename ask = new AskFilename();
    ...
}

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

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

如果上述正确,那么新建 UI 相关对象的正确方法是什么?我知道我可以将 AskFilename 中的所有内容设为静态,或者可以将 ask 设为静态变量,并在完成后将其分配为 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);

此外,您的 Activity 将(隐式)保存对其所有 UI 组件的引用,以及使用 onCreateDialog() 显示的对话框,因此您的对象不会被 GC 拾取。 当您调用 setContextView 或创建对话框时,它会获取这些引用。

关于java - UI 相关对象可以保持可用多久?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4962479/

相关文章:

java - Android Recycler 查看自定义适配器未执行

android - AlertDialog.show() 使我的应用程序崩溃

java - 模型 bean 在 Spring 是单例的吗?

android - 单击菜单按钮时会显示微调器下拉菜单

Netty客户端的Java输入

java - DriverManager.getConnection 无法解析为类型

java - JVM如何增加常量池限制

android - 当按钮具有背景图像时,圆角不起作用

java - 有什么方法可以继承不是@MappedSuperclass 的实体?

java - 在 Android 屏幕的上半部分使用 Canvas 绘制一个圆