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错误?