安卓:对话框:我应该隐藏还是关闭?

36

我在使用Dialog为我的应用创建一些快速视图(例如登录输入名称等),

我想知道哪种方式更好:隐藏还是关闭。

我知道它们的区别,但我一直在思考是否更好地只隐藏一个Dialog,需要时再显示它,还是关闭并重新创建它。

我的Dialog非常小,实际上在代码中是静态的,因此我没有大量的实例。

因此,有人能给我说明使用隐藏或关闭的优缺点吗?


2
这里顺便提一下:静态引用对话框是个坏主意,就像对其他视图一样。这是一个等待发生的内存泄漏。请参见http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html。 - Yoni Samlan
4个回答

67

使用hide()可能会导致Leaked Window错误。

如果您选择使用hide(),并在使用finish()退出应用程序时,这将导致一个关于窗口泄露的错误消息(可在此处查看)。

因此,在调用finish()之前,请正确地使用dismiss()关闭您的对话框,或者只需使用dismiss()而不是hide()


13
+1 是针对我使用 hide() 函数时遇到的泄漏窗口错误信息。 - Steffen
3
那么 hide() 有什么用处? - Pratik Butani
3
我没有个人使用过它,但是我想如果对话框的创建很昂贵并且你需要多次重新显示它,那么使用 hide() 而不是 dismiss() 可以提高性能。 - Joshua Pinter
@JoshPinter 和我想的一样,但我不知道它在实际生活中用在哪里。顺便说一下,谢谢你。 - Pratik Butani
@PratikButani 当然没问题! - Joshua Pinter

29

这取决于你需要多长时间以及创建它是否昂贵。如果创建它不太昂贵,我个人更喜欢放弃它,以获得一个“更清洁的环境”。但是,如果你没有使用数百个对话框,我认为这并不是非常重要。


17

我知道这是一个非常古老的帖子,但我发现以上所有答案都不够好,所以最简单的解释方式如下:

  • hide() 只会更改对话框的可见性状态,但对象仍然存在,可以使用 show() 方法再次显示。
  • dismiss() 隐藏并销毁对话框。要再次显示对话框,需要先重新创建对话框。

如果需要经常显示和隐藏对话框,则最好使用 hide()。最终在 onDestroy() 上调用 dismiss() 以避免窗口泄漏错误。请注意,离开未解除的对话框所在的活动会导致内存泄漏。

希望对未来的参考有所帮助。


1

我猜你所说的“静态”是指内容不是动态的,而不是你的代码中有静态对象。在这种情况下,最好是关闭对话框并允许虚拟机重新收集为其分配的任何内存。创建对话框所需的资源很少,但在不经常使用时保留内存是耗尽系统内存的好方法。

考虑到您的应用程序可能是运行的半打应用程序之一。如果它们都隐藏了它们的“便宜”对象而不是很快将它们关闭,那么VM将被迫关闭某些应用程序以回收内存。

同时,我们正在谈论一个对话框,它并不是一个特别大的对象。我认为标准行为是关闭它,除非您能够提出令人信服的理由,说明隐藏它以节省重新创建资源的成本更便宜(例如,如果您经常显示此对话框)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接