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上看解决办法 发现是在浪费时间 解决不了问题

上一篇下一篇

猜你喜欢

热点阅读