Android 解析 Unable to add window is your activity running?
错误堆栈:
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?相关推荐
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- Android使用ProgressDialog:异常Unable to add window -- toke
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an appli ...
- Unable to add window -- token android.view.ViewRootImpl$W@e3124a is not vali
环境: 在PopopWindow里面使用Spinner组件,会报错如下: E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.sg.huosansi ...
- Android异常之Unable to add window -- token android.os.BinderProxy@d0f9fcf is not valid;
最近在测试项目时,需要添加大量的数据,然后运行App时出现了以下报错,之前遇到过此问题,此次再次遇到,把它记录下来留作记录吧. android.view.WindowManager$BadTokenE ...
- 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 ...
- 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 ...
最新文章
- 第二百一十七节,jQuery EasyUI,NumberSpinner(数字微调)组件
- pytorch 音频分类_Pytorch中音频的神经风格转换
- Linux实战 | 使用Xshell连接Linux_2
- thinkphp5连接数据库mysql_ThinkPHP学习(三)配置PHP5支持MySQL,连接MySQL数据库
- ocp最新题库之052新题带答案整理-36题
- 拓端tecdat|R语言文本主题模型之潜在语义分析(LDA:Latent Dirichlet Allocation)
- Android 四大组件学习之Activity三
- H264的编码负担约是解码的5-10倍
- 摩尔斯电码(摩斯电码)
- Matlab——指派问题
- 计算机硬盘损坏修复软件,电脑硬盘损坏如何修复?自己动手就能解决
- C语言怎么算n维向量的加法,3D数学读书笔记——向量运算及在c++上的实现
- 微信域名防屏蔽防封系统,轻松微信中域名网站被屏蔽被封的问题
- 汉语拼音工具包相关实用方法
- VBA常用小代码:在批注中批量插入图片
- 1752年9月-----消失的那11天
- 4-鸡肉为何如此受欢迎
- java case 的错误_关于java:switch case语句错误:case表达式必须是常量表达式
- Java项目:进销存管理系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
- java 工厂模式实现_Java三种实现工厂模式的方法
热门文章
- linux驱动导出文件属性,linux驱动入门——模块参数和导出符号
- 8086 c语言,2016年上海大学机电工程与自动化学院微机硬件及软件(包含8086微机和C语言)之C程序设计考研复试题库...
- 判断奇偶microsoft visual basic_#梅园# 在心理学上面如何判断一个男生暗恋你的表现...
- 在Heroku上扩展ipify服务
- TagCloudView云标签的灵活运用
- 设计模式系列(一)单例模式
- struts2_11_实现自己的拦截器的定义
- modify timezone
- Solr配置与简单Demo[转]
- 安卓入门笔记之Activity