关于全局异常的捕获我是按照这个帖子写的:
http://blog.youkuaiyun.com/jdsjlzx/article/details/7606423
但是使用过程中出现了错误,错误表现为出现异常,对话框弹出来后短时间内,大概是4S之内点击可以正常退出,我要是4S之后再点击,就没反应,过了一会就anr了.
完全没有思路,希望能得到大家的帮助.
我将里面捕捉到异常弹出Toast的地方替换成了弹出对话框:
弹出对话框的代码如下所示:
这是上传错误信息的函数,也是开了个线程,不知道有没有影响
这里我有个困惑的地方:
我直接在crashhandler中弹出对话框是不行的,需要开个线程,在其中弹出,虽然开了Looper.,但是直接在子线程中弹出感觉好奇怪,但是他正常弹出了
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.,但是直接在子线程中弹出感觉好奇怪,但是他正常弹出了