错误堆栈:

    Process: com.example.caoxinyu.myapplication, PID: 22745android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@2205c13 is not valid; is your activity running?at android.view.ViewRootImpl.setView(ViewRootImpl.java:814)at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:373)at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:95)at android.app.Dialog.show(Dialog.java:342)at android.support.v7.app.AlertDialog$Builder.show(AlertDialog.java:1007)at com.example.caoxinyu.myapplication.Main2Activity$1.run(Main2Activity.java:24)at android.os.Handler.handleCallback(Handler.java:873)at android.os.Handler.dispatchMessage(Handler.java:99)at android.os.Looper.loop(Looper.java:193)at android.app.ActivityThread.main(ActivityThread.java:6743)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:486)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:882)

复现步骤:

public class Main2Activity extends AppCompatActivity {private Handler handler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);handler = new Handler();handler.postDelayed(new Runnable() {@Overridepublic void run() {AlertDialog.Builder builder = new AlertDialog.Builder(Main2Activity.this);builder.setTitle("aaaaa");builder.setMessage("aaaaa");builder.setNegativeButton("fjff",null);builder.setPositiveButton("ffffssss",null).show();}},5000);}
}

当我们打开Activity 之后,等5s dailog 显示 的时候,就会直接崩溃,堆栈就是上面的堆栈。

崩溃时候的调试信息如下:


可以发现,token 是null.

我们看到,其实是同mTokenMap 里面获取的。

mTokenMap 的key是binder。

## 那么什么时候 addToken的呢?

增加token

at com.android.server.wm.DisplayContent.addWindowToken(DisplayContent.java:845)at com.android.server.wm.DisplayContent.reParentWindowToken(DisplayContent.java:886)at com.android.server.wm.WindowToken.onDisplayChanged(WindowToken.java:270)at com.android.server.wm.WindowToken.<init>(WindowToken.java:124)at com.android.server.wm.WindowToken.<init>(WindowToken.java:112)at com.android.server.wm.AppWindowToken.<init>(AppWindowToken.java:290)at com.android.server.wm.AppWindowToken.<init>(AppWindowToken.java:272)at com.android.server.wm.AppWindowContainerController.createAppWindow(AppWindowContainerController.java:246)at com.android.server.wm.AppWindowContainerController.<init>(AppWindowContainerController.java:230)- locked <0x3d36> (a com.android.server.wm.WindowHashMap)at com.android.server.wm.AppWindowContainerController.<init>(AppWindowContainerController.java:200)at com.android.server.am.ActivityRecord.createWindowContainer(ActivityRecord.java:1012)at com.android.server.am.ActivityStack.startActivityLocked(ActivityStack.java:2925)at com.android.server.am.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1496)at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:1257)at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:879)at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:551)at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:1156)- locked <0x3921> (a com.android.server.am.ActivityManagerService)at com.android.server.am.ActivityStarter.execute(ActivityStarter.java:490)at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:5109)at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:5083)at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:5074)at android.app.IActivityManager$Stub.onTransact$startActivity$(IActivityManager.java:13759)at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2681)at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3282)at android.os.Binder.execTransact(Binder.java:740)

我们看到当activity 启动的时候,就会去把token 放到map 里面。

移除token:

   at com.android.server.wm.DisplayContent.removeWindowToken(DisplayContent.java:866)at com.android.server.wm.DisplayContent.removeAppToken(DisplayContent.java:890)at com.android.server.wm.AppWindowContainerController.removeContainer(AppWindowContainerController.java:260)- locked <0x3d36> (a com.android.server.wm.WindowHashMap)at com.android.server.am.ActivityRecord.removeWindowContainer(ActivityRecord.java:1032)at com.android.server.am.ActivityStack.removeActivityFromHistoryLocked(ActivityStack.java:4123)at com.android.server.am.ActivityStack.activityDestroyedLocked(ActivityStack.java:4406)at com.android.server.am.ActivityStack.activityDestroyedLocked(ActivityStack.java:4386)at com.android.server.am.ActivityManagerService.activityDestroyed(ActivityManagerService.java:8070)- locked <0x3921> (a com.android.server.am.ActivityManagerService)at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:3347)at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3282)at android.os.Binder.execTransact(Binder.java:740)

我们看到当activity destory 的时候,就会去把token 从map 里面移除掉。

如果你在activity onDestory 之后,还用这个activity 去显示了弹窗,那么就会挂掉。

当然当app 挂掉的时候,也会移除token

   at com.android.server.wm.DisplayContent.removeWindowToken(DisplayContent.java:866)at com.android.server.wm.WindowToken.removeImmediately(WindowToken.java:262)at com.android.server.wm.AppWindowToken.removeImmediately(AppWindowToken.java:602)at com.android.server.wm.AppWindowToken.removeIfPossible(AppWindowToken.java:609)at com.android.server.wm.AppWindowToken.onRemovedFromDisplay(AppWindowToken.java:674)at com.android.server.wm.DisplayContent.removeAppToken(DisplayContent.java:903)at com.android.server.wm.AppWindowContainerController.removeContainer(AppWindowContainerController.java:260)- locked <0x3d36> (a com.android.server.wm.WindowHashMap)at com.android.server.am.ActivityRecord.removeWindowContainer(ActivityRecord.java:1032)at com.android.server.am.ActivityStack.removeActivityFromHistoryLocked(ActivityStack.java:4123)at com.android.server.am.ActivityStack.removeHistoryRecordsForAppLocked(ActivityStack.java:4516)at com.android.server.am.ActivityStack.handleAppDiedLocked(ActivityStack.java:5006)at com.android.server.am.ActivityStackSupervisor.handleAppDiedLocked(ActivityStackSupervisor.java:2124)at com.android.server.am.ActivityManagerService.handleAppDiedLocked(ActivityManagerService.java:5895)at com.android.server.am.ActivityManagerService.appDiedLocked(ActivityManagerService.java:6076)at com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied(ActivityManagerService.java:1897)- locked <0x3921> (a com.android.server.am.ActivityManagerService)at android.os.BinderProxy.sendDeathNotice(BinderProxy.java:579)

解决方法:

        if (getActivity().isFinishing()  || getActivity().isDestroyed()) {return;}

判断activity 的状态,如果是finishing 或者是已经销毁了,那就不要再弹弹窗了。

Android 解析 Unable to add window is your activity running?相关推荐

  1. Android --- 刚刚进入 Activity 页面的时候无法打开对话框,报错 Unable to add window -- token null is not valid; is your

    报错如下: E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.gxuwz.yixin, PID: 29723java.lang.RuntimeEx ...

  2. Android之Dialog提示Unable to add window -- token is not valid; is your activity running?

    1.问题 Dialog奔溃提示Unable to add window -- token android.os.BinderProxy@b251dbc is not valid; is your ac ...

  3. Unable to add window——token android.os.BinderProxy@196e65b8 is not valid;is your activit is running?

    Caused by: android.view.WindowManager$BadTokenException:Unable to add window--token android.os.Binde ...

  4. Android程序报错:Unable to add window——token android.os.BinderProxy@431e65b8 is not valid

    http://blog.csdn.net/lvyoujt/article/details/51604746 http://blog.csdn.net/lvyoujt/article/details/5 ...

  5. Android使用ProgressDialog:异常Unable to add window -- toke

    android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an appli ...

  6. Unable to add window -- token android.view.ViewRootImpl$W@e3124a is not vali

    环境: 在PopopWindow里面使用Spinner组件,会报错如下: E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.sg.huosansi ...

  7. Android异常之Unable to add window -- token android.os.BinderProxy@d0f9fcf is not valid;

    最近在测试项目时,需要添加大量的数据,然后运行App时出现了以下报错,之前遇到过此问题,此次再次遇到,把它记录下来留作记录吧. android.view.WindowManager$BadTokenE ...

  8. Unable to add window android.view.ColorViewRootImplHooks$ColorW@cc14612 -- permission denied for win

    异常错误: Unable to add window android.view.ColorViewRootImplHooks$ColorW@cc14612 -- permission denied f ...

  9. Android错误之(Android 6.0)Unable to add window android.view.ViewRootImpl$W@d4521e8 -- permission denied

    错误全log信息如下: 08-14 12:54:17.073 6411-6411/? E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.examp ...

最新文章

  1. 第二百一十七节,jQuery EasyUI,NumberSpinner(数字微调)组件
  2. pytorch 音频分类_Pytorch中音频的神经风格转换
  3. Linux实战 | 使用Xshell连接Linux_2
  4. thinkphp5连接数据库mysql_ThinkPHP学习(三)配置PHP5支持MySQL,连接MySQL数据库
  5. ocp最新题库之052新题带答案整理-36题
  6. 拓端tecdat|R语言文本主题模型之潜在语义分析(LDA:Latent Dirichlet Allocation)
  7. Android 四大组件学习之Activity三
  8. H264的编码负担约是解码的5-10倍
  9. 摩尔斯电码(摩斯电码)
  10. Matlab——指派问题
  11. 计算机硬盘损坏修复软件,电脑硬盘损坏如何修复?自己动手就能解决
  12. C语言怎么算n维向量的加法,3D数学读书笔记——向量运算及在c++上的实现
  13. 微信域名防屏蔽防封系统,轻松微信中域名网站被屏蔽被封的问题
  14. 汉语拼音工具包相关实用方法
  15. VBA常用小代码:在批注中批量插入图片
  16. 1752年9月-----消失的那11天
  17. 4-鸡肉为何如此受欢迎
  18. java case 的错误_关于java:switch case语句错误:case表达式必须是常量表达式
  19. Java项目:进销存管理系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
  20. java 工厂模式实现_Java三种实现工厂模式的方法

热门文章

  1. linux驱动导出文件属性,linux驱动入门——模块参数和导出符号
  2. 8086 c语言,2016年上海大学机电工程与自动化学院微机硬件及软件(包含8086微机和C语言)之C程序设计考研复试题库...
  3. 判断奇偶microsoft visual basic_#梅园# 在心理学上面如何判断一个男生暗恋你的表现...
  4. 在Heroku上扩展ipify服务
  5. TagCloudView云标签的灵活运用
  6. 设计模式系列(一)单例模式
  7. struts2_11_实现自己的拦截器的定义
  8. modify timezone
  9. Solr配置与简单Demo[转]
  10. 安卓入门笔记之Activity