Android关于全局异常捕获及发送到服务器
来源:互联网 发布:彗星dns优化器手机版 编辑:程序博客网 时间:2024/05/18 00:59
在做项目的过程中,出现异常是在所难免的,Android开发也难逃一劫。
搞过Android开发的朋友都知道,只要程序中出现有异常情况,如果没有对异常进行处理,那么整个应用程序都会出现崩溃的现象。如果是在调试的阶段出现崩溃现象到是没有什么大问题,因为你可以通过控制台打印出异常信息,进而修改代码,避免异常。可是,如果产品已经上线了,用户在使用过程中出现崩溃,这时候你应该怎么办呢?直接找客户看异常信息?不可能,因为你没有对异常信息进行捕获,一崩溃就什么都“消失”了。还有,假设你对捕获了异常信息,把异常信息想写到了sd卡里面,但是出现问题的手机是在用户手上,出现异常你就找客户,让他去他手机上的SD卡查看异常信息,然后再告诉你哪里出现了问题。我说兄弟,你不要指望每个用户都是程序员!
好了,面对以上出现的问题,我们应该如何解决呢?
一、进行全局异常捕获
二、将异常信息写入SD卡
三、程序崩溃了就无法访问网络了,故当再次启动应用程序时,将写到SD卡里面的异常信息读取出来,然后发送到服务器。这样开发人员就可以看到用户手机上出现的异常情况了
可是摆在面前的一个问题,如何全局捕获异常信息?
步骤:
1.定义一个类,该类继承Application类
2.在配置文件清单中配置该Application类
3.实现oncreate方法,捕获异常信息
关键代码:
import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.PrintWriter;import java.io.StringWriter;import java.lang.Thread.UncaughtExceptionHandler;import android.app.Application;import android.os.Environment;/** * 注意:一定要记得在清单文件中配置 * @author Administrator * */public class BaseApplication extends Application { //Called when the application is starting当应用程序被开启的时候调用 //before any other application objects have been created @Override public void onCreate() { //老母子的方法。 基地 //重新系统的异常处理器 Thread.currentThread().setUncaughtExceptionHandler(new MyExceptionHander()); super.onCreate(); } //要全局捕获异常,需要自定义一个类,该类须要继承UncaughtExceptionHandler private class MyExceptionHander implements UncaughtExceptionHandler{ @Override public void uncaughtException(Thread thread, Throwable ex) { //留下了 留下遗嘱的时间 System.out.println("发生了异常,但是被我们给捕获了。。"); //专注自杀的方法,就是杀死自己的进程, 早死早超生 android.os.Process.killProcess(android.os.Process.myPid()); } }}
通过以上代码,我们已经可以全局捕获到异常信息了,也就是不管你的app在哪里出现了异常,基本上都可以捕获得到。捕获到的异常,通过参数ex传入到方法uncaughtException()中,下一步,我们在方法uncaughtException()将异常信息写到SD卡里
关键代码如下:
try { StringWriter wr = new StringWriter(); PrintWriter pw = new PrintWriter(wr); ex.printStackTrace(pw); File file = new File(Environment.getExternalStorageDirectory(),"error.log"); FileOutputStream fos = new FileOutputStream(file); fos.write(wr.toString().getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); }
整体代码如下:
import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.PrintWriter;import java.io.StringWriter;import java.lang.Thread.UncaughtExceptionHandler;import android.app.Application;import android.os.Environment;/** * 注意:一定要记得在清单文件中配置 * @author Administrator * */public class MobileSafeApplication extends Application { //Called when the application is starting当应用程序被开启的时候调用 //before any other application objects have been created @Override public void onCreate() { //老母子的方法。 基地 //重新系统的异常处理器 Thread.currentThread().setUncaughtExceptionHandler(new MyExceptionHander()); super.onCreate(); } private class MyExceptionHander implements UncaughtExceptionHandler{ @Override public void uncaughtException(Thread thread, Throwable ex) { //留下了 留下遗嘱的时间 System.out.println("发生了异常,但是被我们给捕获了。。"); try { StringWriter wr = new StringWriter(); PrintWriter pw = new PrintWriter(wr); ex.printStackTrace(pw); File file = new File(Environment.getExternalStorageDirectory(),"error.log"); FileOutputStream fos = new FileOutputStream(file); fos.write(wr.toString().getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); } //专注自杀的方法,就是杀死自己的进程, 早死早超生 android.os.Process.killProcess(android.os.Process.myPid()); } }}
好了,我们已经把异常信息写到SD卡里面了,但只要出现异常崩溃,程序就挂了,虽然可以通过SD卡里面保存的异常日志查看异常信息,可是出现问题的手机可能是客户的,所以为了能让我们开发人员更好的维护,就要在application调用oncreate方法时,将异常信息发送到服务器。有一个免费的比较好的异常管理工具,叫做bugly,它是腾讯bugly提供的,网址> http://bugly.qq.com,不收钱,只要大家使用QQ登录进去就可以了,并且界面管理得挺好,它其实已经帮我们把以上关于全局异常捕获的类封装好了,还提供了一个异常回调的函数。我们只需要将其jar包导入到自己的工程,在application中调用,就可以了。
关键代码如下:
CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(context); //App的策略Bean strategy.setAppVersion(CommonUtil.getVersionName(context)); //App的版本 strategy.setAppReportDelay(5000); //设置SDK处理延时,毫秒 //回调类CrashHandleCallback的方法里面已经封装了全局捕获异常,并且当出现异常时,自动上传到腾讯bugly,无需手动上传 strategy.setCrashHandleCallback(new CrashReport.CrashHandleCallback() { /** * * @param crashType 错误类型 CRASHTYPE_JAVA=0,CRASHTYPE_NATIVE=2;CRASHTYPE_U3D=3;CRASHTYPE_ANR=4 * @param errorType 错误类型名 * @param errorMessage 错误信息 * @param errorStack 错误堆栈 * @param //Map<String key, String value> 额外的自定义上传信息 * @return */ @Override public synchronized Map<String, String> onCrashHandleStart(int crashType, String errorType, String errorMessage, String errorStack) { FileOutputStream fos=null; try { File file = new File(Environment.getExternalStorageDirectory(),"/error.log");// File file = new File("E://error.log"); fos = new FileOutputStream(file); String time= CommonUtil.getDateFormat(System.currentTimeMillis()); String error="crashType----->"+crashType+"--errorType--"+errorType+"--errorMessage-->"+errorMessage+"--errorStack-->"+errorStack+"_发生异常时间:"+time; LogUtils.d(this.getClass().getSimpleName(),error); fos.write(error.getBytes()); } catch (Exception e) { e.printStackTrace(); }finally{ if(fos!=null){ try { fos.close(); } catch (IOException e) { e.printStackTrace(); } fos=null; } } //专注自杀的方法,就是杀死自己的进程, 早死早超生,但杀死进程后,将无法上传异常到腾讯bugly Process.killProcess(Process.myPid()); return null; } }); CrashReport.initCrashReport(context, "900004802", true, strategy); //自定义策略生效,必须在初始化SDK前调用 CrashReport.setUserId("aixiu_org");
也就是说,我们在处理异常的时候,前面的步骤也都可以忽略掉了,直接参考腾讯bugly提供文档,然后把它集成到自己的项目中,就OK了。这样,当出现异常信息的时候,不仅可以写到SD卡,再次进入app时,还可以将异常信息上报到bugly服务器,只要登录到
http://bugly.qq.com就可以管理了
如果这文章对你有用,请点赞,谢谢!!!
- Android关于全局异常捕获及发送到服务器
- Android全局捕获异常信息,并上传到服务器。
- 捕获全局异常,上传到服务器
- Android捕获全局异常并以文件或者异常内容发送给指定服务器
- android 捕获全局异常
- android 捕获全局异常
- Android 捕获全局异常
- android 全局异常捕获
- android捕获全局异常
- android捕获全局异常
- android 全局异常 捕获
- Android捕获全局异常
- android 捕获全局异常
- Android全局捕获异常
- android 捕获全局异常
- Android全局异常捕获
- android 全局异常捕获
- Android 全局异常捕获
- Java - How Classpath works in Java
- BAT内部级别和薪资待遇到底怎样?
- windows下webrtc的编译 2016
- spark中RDD深入了解
- 高质量程序优化总结整理【经典】
- Android关于全局异常捕获及发送到服务器
- 多台虚拟机的ip设置及相互访问
- 9款免费且超实用的响应式网页测试工具
- 1 Android M Developer Preview - Program Overview
- 【leetcode算法】更新至62题
- 数据库优化
- IOS - 横线和竖线(分割线)
- 【mysql】Mysql数据库备份和按条件导出表数据
- 基于lucene的案例开发:纵横小说数据库操作