协慌网

登录 贡献 社区

对话框以 getApplication()为上下文,抛出 “无法添加窗口 - 令牌 null 不适用于应用程序” 的对话框

我的活动试图创建一个 AlertContext,它需要一个 Context 作为参数。如果我使用,这可以按预期工作:

AlertDialog.Builder builder = new AlertDialog.Builder(this);

但是,我很乐意使用 “this” 作为上下文,因为即使在诸如屏幕旋转之类的简单操作中销毁并重新创建 Activity 时,也可能会发生内存泄漏。摘自Android 开发者博客上的一篇相关文章:

有两种简单的方法可以避免与上下文相关的内存泄漏。最明显的是避免将上下文转义超出其自身范围。上面的示例显示了静态引用的情况,但是内部类及其对外部类的隐式引用可能同样危险。第二种解决方案是使用 Application 上下文。只要您的应用程序处于活动状态,并且不依赖于活动生命周期,该上下文将一直存在。如果计划保留需要上下文的长期对象,请记住该应用程序对象。您可以通过调用 Context.getApplicationContext()或 Activity.getApplication()轻松获得它。

但是对于AlertDialog() getApplicationContext()getApplication()都不能作为上下文使用,因为它会引发异常:

“无法添加窗口 - 令牌 null 不适用于应用程序”

每引用: 123 ,等等。

Activity.getApplication()却不能如所宣传的那样起作用,因此这真的应该被视为 “错误” 吗?

吉姆

答案

代替getApplicationContext() ,只需使用ActivityName.this

使用this并没有为我工作,但MyActivityName.this做到了。希望这对任何无法使用this有所帮助。

您可以继续使用getApplicationContext() ,但是在使用之前,应该添加以下标志: dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT) ,并且不会显示错误。

将以下权限添加到清单中:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />