关于ProgressDialog.show抛出android.view.WindowManager$BadTokenException: Unable to add window

Posted 竹山一叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于ProgressDialog.show抛出android.view.WindowManager$BadTokenException: Unable to add window相关的知识,希望对你有一定的参考价值。

        下午摆弄ProgressDialog,进入就抛错:android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application,让我百思不得其解。我这使用这种方法实现的进度对话框:proDialog = ProgressDialog.show(getApplicationContext(), "sadfs", "dddddd",true);
查证得知

导致异常的原因就是这个getApplicationContext(),虽然这里的参数也是获得一个context,但不能使用getApplicationContext()获得的Context。必须使用Activity,因为只有一个Activity才能添加一个窗体


解决方法:将参数中的getApplicationContext() 改为xxActivity.this就ok了


ProgressDialog对象是依赖于一个View的,而View是和一个Activity对应的。 于是,这里涉及到一个生命周期的问题,this.getApplicationContext()取的是这个应 用程序的Context,Activity.this取的是这个Activity的Context,这两者的生命周期是不同 的,前者的生命周期是整个应用,后者的生命周期只是它所在的Activity。而ProgressDialog应
该是属于一个Activity的,在Activity销毁的时候它也就销毁了,不会再存在;但是,如果传 入this.getApplicationContext(),就表示它的生命周期是整个应用程序,这显然超过了它 的生命周期了。 所以,在这里我们只能使用Activity的this。















以上是关于关于ProgressDialog.show抛出android.view.WindowManager$BadTokenException: Unable to add window的主要内容,如果未能解决你的问题,请参考以下文章

ProgressDialog.show() - Activity 已泄露窗口

ProgressDialog的详细使用总结

如何将主题设置为 ProgressDialog?

带有 ProgressDialog 和进度条的 AsyncTask

3.3 进度对话框

使用Spire组件抛出异常The type initializer for 'spr857' threw an exception