BadTokenException: Unable to add window Toast Handler

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.on, PID: 5017
	android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@7cdb1a7 is not valid; is your activity running?
	at android.view.ViewRootImpl.setView(ViewRootImpl.java:679)
	at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342)
	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:94)
	at android.widget.Toast$TN.handleShow(Toast.java:434)
	at android.widget.Toast$TN$2.handleMessage(Toast.java:345)
	at android.os.Handler.dispatchMessage(Handler.java:102)
	at android.os.Looper.loop(Looper.java:154)
	at android.app.ActivityThread.main(ActivityThread.java:6119)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

循环延时2秒发送消息到主线程,handler内显示Toast。报以上异常。

代码:

    private Timer timer;
    private TimerTask timerTask;
    private final int WHAT=1;
    private Handler handler=new Handler(Looper.getMainLooper()){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(msg.what==WHAT) {
                List<SensorAngle> list = new ArrayList<>();
                list= (List<SensorAngle>) msg.obj;
                int totals=msg.arg1;
                Log.e("auto",list+","+totals);
                if(list == null || list.isEmpty()) {
                    tvHint.setText("没有查询到对应的数据");
                    toast("没有查询到对应的数据");
                    return;
                }
                tvHint.setText("");
                llTitle.setVisibility(View.VISIBLE);
                recyclerView.setVisibility(View.VISIBLE);
                adapter=new SearchAngleAdapter(SearchAngleActivity.this,list);
                recyclerView.setAdapter(adapter);
            }
        }

    //刷新方式的选择
    radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                if(R.id.rb_manual==i) {
                    if(timer!=null) {
                        timer.cancel();
                        timer=null;
                    }
                } else if(R.id.rb_auto==i) {
                    if(timer==null) {
                        timer=new Timer();
                        timerTask=new TimerTask() {
                            @Override
                            public void run() {
                                //查数据库
                                List<SensorAngle> list = new ArrayList<>();
                                list = dbOperator.getLatestSensorAngleList(Constant.PAGE_SIZE);
                                long totals = dbOperator.getSensorIdCount(Constant.SENSOR_TYPE_ANGLE);
                                Message message=Message.obtain();
                                message.what=WHAT;
                                message.obj=list;
                                message.arg1=new Long(totals).intValue();
                                handler.sendMessage(message);
                            }
                        };
                        //延时2秒
                        timer.schedule(timerTask,0,2000);
                    }
                }
            }
        });

查询发现是android 7.x的bug。

原因及解决办法参考文章Android 7.X Toast Bug

 

参考:大家有没有遇到过只在 Android 7.1 机型上报告的由Toast引起的BadTokenException错误?

Toast源码深度分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值