全局捕获异常时对话框按钮点击引起ANR

全局异常处理与对话框
关于全局异常的捕获我是按照这个帖子写的:
http://blog.youkuaiyun.com/jdsjlzx/article/details/7606423

但是使用过程中出现了错误,错误表现为出现异常,对话框弹出来后短时间内,大概是4S之内点击可以正常退出,我要是4S之后再点击,就没反应,过了一会就anr了.

完全没有思路,希望能得到大家的帮助.

我将里面捕捉到异常弹出Toast的地方替换成了弹出对话框:

    /**
     * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
     *
     * @param ex
     * @return true:如果处理了该异常信息;否则返回false.
     */
    private boolean handleException(Throwable ex) {

        if (ex == null) {
            return false;
        }

        //收集设备参数信息
        collectDeviceInfo();
        //收集异常信息
        collectExceptionInfo(ex);
        //上传错误信息
        uploadErrorInfo();

        //使用Dialog来显示异常信息
        new Thread() {
            @Override
            public void run() {
                Looper.prepare();
                initDialog();
                Looper.loop();
            }
        }.start();


        return true;
    }



弹出对话框的代码如下所示:
 /**
     * 初始化对话框
     */
    public void initDialog() {

        Activity currentActivity = AppManager.getAppManager().currentActivity();
        //显示提示对话框
        MyAlertDialog dialog = new MyAlertDialog(currentActivity);
        dialog.ensureDialog("提示","很抱歉,程序出现了bug,请将错误信息发送给我们,以便来更好的服务于大家","" ,"感激不尽~,点击退出程序","",new MyAlertDialog.DialogCallBack() {
            @Override
            public void onEnSure() {
                //将用户ID统计登出
                MobclickAgent.onProfileSignOff();
                System.runFinalizersOnExit(true);

                //退出程序
                AppManager.getAppManager().AppExit();

            }

            @Override
            public void onCancel() {

            }
        });

    }



这是上传错误信息的函数,也是开了个线程,不知道有没有影响
    /**
     * 上传错误信息
     */
    public void uploadErrorInfo(){

        new Thread(new Runnable() {
            @Override
            public void run() {

                String content = infos.get("exceptionInfo");
                Bug_in bug_in = new Bug_in();
                bug_in.setSoftType("android移动端");
                bug_in.setUserName(GlobalSingleton.CreateInstance().UserName== null?"未登录":GlobalSingleton.CreateInstance().UserName);
                bug_in.setOS(PhoneUtils.getOS());
                bug_in.setDotNet("无");
                bug_in.setSoft(infos.get("applicationName"));
                bug_in.setVersion(infos.get("versionName"));
                bug_in.setResolution(infos.get("screen"));
                bug_in.setMac(infos.get("mac"));
                bug_in.setHardwareInfo(infos.get("deviceInfo"));
                bug_in.setContent(content);


                //URL的最大长度是8192,所以要使用post请求方式,因为参数的长度不会受到限制,否则会出现404错误
                String params = SplitParam(bug_in);
                HttpURLConnection conn=null;


                try {
                    URL ur = new URL(APPFinal.URL_BUGSEND);
                    conn = (HttpURLConnection) ur.openConnection();
                    conn.setConnectTimeout(5000);
                    conn.setRequestMethod("POST");//设置URL请求方法
                    //3.设置post提交内容的类型和长度
                    conn.setRequestProperty("contentType","application/x-www-form-urlencoded");
                    conn.setRequestProperty("Content-Length", String.valueOf(params.getBytes().length));
                    //默认为false
                    conn.setDoOutput(true);
                    //4.向服务器写入数据
                    conn.getOutputStream().write(params.getBytes());
                    int code = conn.getResponseCode();
                    if (code == 200) {

                        InputStream is = conn.getInputStream(); // 字节流转换成字符串
                        String str=StreamTools.streamToString(is);
                        if (str.equals("success")){
                            isSuccess = true;
                        }

                       Log.d("hhhhhhhhhhh","-------code = 200---"+str);
                    } else {
                        Log.d("hhhhhhhhhhh","------异常----code ="+code);
                    }
                } catch (Exception e) {
                    Log.d("hhhhhhhhhhh","------异常----连接失败");
                    e.printStackTrace();
                }finally {
                    try{
                        conn.disconnect();
                    }catch (Exception e){}
                }


            }
        }).start();





    }



这里我有个困惑的地方:
我直接在crashhandler中弹出对话框是不行的,需要开个线程,在其中弹出,虽然开了Looper.,但是直接在子线程中弹出感觉好奇怪,但是他正常弹出了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值