问题描述
公司某个产品有反馈,说是在进入某个界面时容易引发崩溃,要到了崩溃日志后发现,确实爆出了一个异常,非必现,偶发bug,一看就大概明白是啥原因了,自己就写了个demo,复现了这个问题,下面是报错日志
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.wisely, PID: 12063
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@bf4921f is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:696)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:347)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:94)
at android.app.Dialog.show(Dialog.java:319)
at com.wisely.DialogUtil.showProgressDialog(DialogUtil.java:54)
at com.wisely.DialogUtil.showProgressDialog(DialogUtil.java:16)
at com.wisely.activity.bug.WindowDestroyBugActivity$1.handleMessage(WindowDestroyBugActivity.java:29)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6114)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:874)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:764)
复现bug的代码
xml比较简单,未列出,当前Activity继承了一个自己写的BaseActivity,其实什么都没做,而且我本身也不建议这种抽取,不过因为这是我的demo集,场景特殊,所以才抽取了这个BaseActivity。
注意,下面的代码是有问题的代码,切勿复制粘贴。
public class WindowDestroyBugActivity extends BaseActivity {
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
DialogUtil.showProgressDialog(WindowDestroyBugActivity.this, "弹窗喽");
break;
}
}
};
/**
* 点击事件的回调,在xml中写的
*/
public void onClick(View v) {
switch (v.getId()) {
case R.id.tv_unable_to_add_window_finish:
finish();
mHandler.sendEmptyMessageDelayed(1, 3000);
break;
}
}
@Override
public int getLayoutResource() {
return R.layout.activity_unable_to_add_window;
}
@Override
public String getTitleContent() {
return "Unable to add window——token android.os.BinderProxy@2ed5fc06 is not valid;is your activity running?";
}
}
/**