Caused by: android.view.WindowManager$BadTokenException:Unable to add window——token android.os.BinderProxy@196e65b8 is not valid;is your activit is running?

  1. 分析日志,根据日志可知原因:无法加载一个window,一个Binder 代理无效(BinderProxy),至于什么是Binder代理(BinderProxy)这里就不解释了。
          那这个日志到底是什么意思呢那这个日志到底是什么意思呢?
    其实也就是说,当你要显示一个View1,而此时View1所依赖的View不存在,或者finish了就会出现这样的问题,但是所依赖的View不存在的情况有很多种,这个原因,自己多debug 看看,具体为什么所依赖的View 不存在了。下面我复现一下我出现的这个问题情形。

1.1、主Activity

1.1.1、SinglerTonActivity .java

public class SinglerTonActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_singler_ton);}public void into(View v){ //此方法定义在下面的xml中Intent intent = new Intent(SinglerTonActivity.this, A_Activity.class);startActivity(intent);}
}

1.1.2、activity_singler_ton.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:text="弹出淡漠Dialog"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="into"android:clickable="true"/>
</LinearLayout>

1.2、从SinglerTonActivity跳转到A_Activity

1.2.1、A_Activity.java

public class A_Activity extends AppCompatActivity {private SingerTonDialog dialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_a_);dialog = SingerTonDialog.getInstance(A_Activity.this);}public void showDialog(View v){dialog.show();}
}

1.2.2、activity_a_.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:text="弹出单例模式Dialog"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="showDialog"android:clickable="true"/>
</LinearLayout>

1.3、 弹出的Dialog

1.3.1、SingerTonDialog.java

public class SingerTonDialog {private Dialog dialog;public volatile static SingerTonDialog progress;public static SingerTonDialog getInstance(Context context){if (progress == null)synchronized (AlertDialog.class){if (progress == null)progress = new SingerTonDialog(context);}return progress;}public SingerTonDialog(Context context){View v = LayoutInflater.from(context).inflate(R.layout.singler_ton_dialog,null);dialog = new Dialog(context,R.style.refresh_dialog);ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.FILL_PARENT);dialog.setContentView(v, params);}public SingerTonDialog show(){dialog.show();return progress;}public void dismiss(){dialog.dismiss();}
}

1.3.2、singler_ton_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="这是A_Activity中的对话框"android:gravity="center"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="而且它还是单例模式哦"/>
</LinearLayout>

到此,代码片段贴完了。下面我们简单的分析分析这个依赖的View(此处为Activity)为什么空了

  • 1、我们首先从SinglerTonActivity(主Activity)跳转到 A_Activity,

  • 2、在 A_Activity中通过点击事件,弹出一个dialog

    • 根据Activity的生命周期,每次跳转到 A_Activity,都会执行onCreate方法,那么就会去创建SingerTonDialog实例(对象),然后传入Context。
    • 然后通过 SingerTonDialog 对象的 show方法弹出这个dialog。
  • 问题:按照这个思路走,SingerTonDialog 所依赖的View (A_Activity)不是每次走了onCreate 等方法吗,既然走完了Activity的生命周期,按理说Activity应该存在啊,那么为什么此处出现了这个问题?我的Activity不存在?不应该,肯定的存在的。没错,我是这样的想的,奇怪,去趟WC。

  • 回来突然想起来了,手残也SingerTonDialog的时候,把它写成了单例模式,而这个单例写的对于java来说,问题不大,但在此处问题却是致命。

  • 看看SingerTonDialog这个类,我们用static volatile 关键字去修饰了这个对象,并且还是双重验证。

  • 那么你看出来了吗?问题就出现在这个 static volatile 这,或者说 static 这,由于我用了static 修饰了这个类,那么SingerTonDialog 将会一直存在(至于什么时候GC回收,会不会回收等问题在此不解释)。

  • 那么第一次创建SingerTonDialog这个对象的时候传进来的Context(Binger代理-BinderProxy@196e65b8)去创建Dialog,且创建后悔一直存在,在下一次在此创建的时候,由于这个对象一直存在,所以下一次就不会用新传进来的Context去创建Dlialog。

  • 而是用上一次的Context去创建,但是上一次的Activity 不存在了,所以第二次开始,当点击事件弹出这个Dialog的时候就会出现这个问题。到此,原因应该解释清楚了,那么此情景解决办法应该也知道了吧,就不在此说了。

    如有说错,欢迎大佬留言指正,权当记录错误,在此相互学习学习

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

  1. 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 ...

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

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

  3. Unable to add window -- token android.os.BinderProxy---Android原生开发工作笔记142

    这个错误是由于: public void show() {loadingDialog.show();} 这个之前是上面这样写的.这样写,就会导致,我调用这个dialog,去显示的时候,这个dialog ...

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

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

  5. 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 ...

  6. 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 ...

  7. Android之运行PopupWindow提示Unable to add window -- token null is not valid; is your activity running?

    1.问题 在使用PopupWindow的时候,我们构建好了直接放在Activity的onCreate函数里面直接运行,提示这个错误 Unable to add window -- token null ...

  8. AlertDialog显示错误 Unable to add window token null is not for an application

    在listView的onItemClick函数中显示一个AlertDialog,出现如下错误 08-07 21:26:43.506: ERROR/AndroidRuntime(9390): andro ...

  9. Unable to add window token null is not valid is your activity running

    莫名其妙的报错 错误原因是不在主线程调用了弹窗方法 解决方法很简单 创建Handler static final int REFRESH_COMPLETE = 0X1112; private Hand ...

最新文章

  1. .NET中多线程的使用
  2. 【BZOJ1010】【HNOI2008】玩具装箱(斜率优化,动态规划)
  3. 数据结构哪本书比较好_东莞工厂电动伸缩门固定在哪一边比较好?
  4. ssd测试工具crystaldiskmark_使用SSD增强Ceph性能并对比测试
  5. JDK中没有jre文件夹和tools.jar文件
  6. 基于Xml 的IOC 容器-载入<property>元素
  7. linux下mkdir头文件_Linux中判断一个目录是否存在,如果不存在就创建这个目录
  8. Java自动切表_java_Mybatis自动创建表和更新表结构,最近有小伙伴问我mybatis有没有 - phpStudy...
  9. 使用PuTTY远程连接Linux
  10. jsoup爬虫,爬取全站代码
  11. CListCtrl控件的使用指南 (转)
  12. Win7 下替代NetMeeting的屏幕共享工具 InletexEMC
  13. Windows 命令行cmd破解WiFi密码
  14. 解决DNS解析故障的几种方法
  15. 获取今天是星期几的四种写法
  16. Keil更改背景颜色
  17. ss terminal下客户端sslocal+proxychains或者privoxy
  18. 白银价格转换器(美元/盎司-人民币/克)
  19. vscode使用vetur格式化代码
  20. PCL Super4PCS点云粗配准(源码编译)

热门文章

  1. Centos7安装php7.4
  2. 计算机术语桢什么意思,120桢什么意思
  3. 机器人彩铅画_高达机器人铅笔画图片
  4. 测试功放HT8692HT8299s
  5. mac电脑打不开应用程序的解决方法
  6. bilibiliC++概念遍览
  7. aria2c rpc php,Mac上配置 aria2c 神器
  8. 计算机视觉基础-图像处理-几何变换
  9. 01_Dive_into_python (reading note)
  10. 思科ISR4400交换机查看光模块光功率