AlertDialog的报错 android.view.Wind
2021-12-22 本文已影响0人
雨来
项目中用到了im的监听 只在部分页面写了监听并弹出dialog 现在让除了部分页面不弹出其它页面都弹出
当然这个监听是很好处理的 如果我们的activity有基类 如BaseActivity 在BaseActivity的onResume方法里面 排除其它activity 然后设置监听就ok了 如果项目写的比较烂没有基类 就像我现在接手的项目 我们可以直接在Application中 注册 ActivityLifecycleCallbacks 的监听
registerActivityLifecycleCallbacks(new StatisticActivityLifecycleCallback());
在其回调方法 onActivityResumed中 直接设置监听 (具体在在这里设置什么 诸位是根据自已项目的需求来的)
@Override
public void onActivityResumed(Activity activity) {
//图文咨询的监听
if (!(activity instanceof Login_bindPass_Activity) &&
!(activity instanceof Login_pass_Activity) &&
!(activity instanceof Login_yzm_Activity) &&
!(activity instanceof Login_yzm_other_Activity) &&
!(activity instanceof LoginActivity) &&
!(activity instanceof LoginOtherActivity) &&
!(activity instanceof Reg_Activity)
)
{
V2TIMManager.getInstance().addSimpleMsgListener(
new V2TIMSimpleMsgListener() {
@Override
public void onRecvC2CCustomMessage(String msgID, V2TIMUserInfo sender, byte[] customData) {
super.onRecvC2CCustomMessage(msgID, sender, customData);
JieDanDialog infoDialog = null;
Api.eLog("-=customData-=-", "customData:" + StringUtil.bytes2string(customData) + PreferenceUtil.getBoolean("appStartGetorder", false));
try {
String data = StringUtil.bytes2string(customData);
if (!StringUtil.isEmpty(data)) {
JSONObject js = new JSONObject(StringUtil.bytes2string(customData));
if (PreferenceUtil.getBoolean("appStartGetorder", false)) {
if (js.optString("text").equals("快快接单")) {
String orderId = js.optString("businessID");
if (!StringUtil.isEmpty(orderId)) {
infoDialog = new JieDanDialog.Builder(activity, activity, "接单", msgID, sender.getUserID(), sender.getNickName(), orderId)
.setIcon(R.mipmap.icon)
.setMessage("大家好")
.setButton("再来一次", new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}
).create();
infoDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
if(!activity.isFinishing()){
if(!infoDialog.isShowing()){
infoDialog.show();
}
}
}
}
if (js.optString("text").equals("用户取消咨询")) {
if (null != infoDialog) {
infoDialog.cancel();
}
}
if (js.optString("text").equals("大师兄已接受咨询")) {
String orderId = js.optString("businessID");
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
);
}
}
我是在 infoDialog.show() 一调用show的时候 就报下面的错误
参考:https://stackoverflow.com/questions/9529504/unable-to-add-window-token-android-os-binderproxy-is-not-valid-is-your-activ
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@62f563f is not valid; is your activity running?
解决办法就是 判断一下当前activity 是否是 isFinishing状态
if(!activity.isFinishing()){
if(!infoDialog.isShowing()){
infoDialog.show();
}
}
主要原因是因为AlertDialog 是依附于activity存活的 你去csdn上看解决办法 发现是在浪费时间 解决不了问题