gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:23:43 25 4
gpt4 key购买 nike

我想这是一个蹩脚的问题,我什至都无法编出一个合适的主题!这是我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com