【发布时间】:2020-09-17 21:38:22
【问题描述】:
我的 Activity 正在尝试创建一个需要 Context 作为参数的 AlertDialog。如果我使用,这将按预期工作:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
但是,我对使用“this”作为上下文持怀疑态度,因为即使在屏幕旋转之类的简单操作中,当 Activity 被销毁和重新创建时也可能发生内存泄漏。来自related post on the Android developer's blog:
有两种简单的方法可以避免与上下文相关的内存泄漏。最明显的一个是避免将上下文转义到其自身范围之外。上面的示例显示了静态引用的情况,但内部类及其对外部类的隐式引用可能同样危险。第二种解决方案是使用应用程序上下文。只要您的应用程序处于活动状态并且不依赖于活动生命周期,此上下文就会存在。如果您打算保留需要上下文的长期对象,请记住应用程序对象。您可以通过调用 Context.getApplicationContext() 或 Activity.getApplication() 轻松获取。
但是对于AlertDialog(),getApplicationContext() 或getApplication() 都不能作为上下文,因为它会引发异常:
“无法添加窗口 - 令牌 null 不适用于应用程序”
那么,既然官方建议我们使用Activity.getApplication(),但它并没有像宣传的那样发挥作用,那么这真的应该被视为一个“错误”吗?
吉姆
【问题讨论】:
-
R.Guy 建议使用 getApplication 的第一项参考:android-developers.blogspot.com/2009/01/…
标签: android android-alertdialog android-context builder