美文网首页
AlertDialog的报错 android.view.Wind

AlertDialog的报错 android.view.Wind

作者: 雨来 | 来源:发表于2021-12-22 14:46 被阅读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上看解决办法 发现是在浪费时间 解决不了问题

    相关文章

      网友评论

          本文标题:AlertDialog的报错 android.view.Wind

          本文链接:https://www.haomeiwen.com/subject/nlmqqrtx.html