UncaughtException处理类,当程序发生Uncaught异常的时候,有该类来接管程序,并记录发送错误报告.
1.java文件

public class CrashHandler implements Thread.UncaughtExceptionHandler {public static final String TAG = "CrashHandler";// CrashHandler 实例private static CrashHandler INSTANCE = new CrashHandler();// 程序的 Context 对象private Context mContext;// 系统默认的 UncaughtException 处理类private Thread.UncaughtExceptionHandler mDefaultHandler;// 用来存储设备信息和异常信息private Map<String, String> infos = new HashMap<String, String>();// 用于格式化日期,作为日志文件名的一部分private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");/** 保证只有一个 CrashHandler 实例 */private CrashHandler() {}/** 获取 CrashHandler 实例 ,单例模式 */public static CrashHandler getInstance() {return INSTANCE;}/*** 初始化** @param context*/public void init(Context context) {mContext = context;// 获取系统默认的 UncaughtException 处理器mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();// 设置该 CrashHandler 为程序的默认处理器Thread.setDefaultUncaughtExceptionHandler(this);}/*** 当 UncaughtException 发生时会转入该函数来处理*/@Overridepublic void uncaughtException(Thread thread, Throwable ex) {if (!handleException(ex) && mDefaultHandler != null) {// 如果用户没有处理则让系统默认的异常处理器来处理mDefaultHandler.uncaughtException(thread, ex);} else {try {Thread.sleep(2000);} catch (InterruptedException e) {Log.e(TAG, "error : ", e);}//捕获异常后退出整个应用程序App.application.RemoveActivity();// 结束线程,一般与移除所有Activity配合使用android.os.Process.killProcess(android.os.Process.myPid());// System.exit(0);}}/*** 自定义错误处理,收集错误信息,发送错误报告等操作均在此完成** @param ex* @return true:如果处理了该异常信息;否则返回 false*/private boolean handleException(Throwable ex) {if (ex == null) {return false;}// 使用 Toast 来显示异常信息new Thread() {@Overridepublic void run() {Looper.prepare();Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出。", Toast.LENGTH_LONG).show();Looper.loop();}}.start();// 收集设备参数信息collectDeviceInfo(mContext);// 保存日志文件saveCrashInfo2File(ex);return true;}/*** 收集设备参数信息* @param ctx*/public void collectDeviceInfo(Context ctx) {try {PackageManager pm = ctx.getPackageManager();PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(), PackageManager.GET_ACTIVITIES);if (pi != null) {String versionName = pi.versionName == null ? "null" : pi.versionName;String versionCode = pi.versionCode + "";infos.put("versionName", versionName);infos.put("versionCode", versionCode);}} catch (PackageManager.NameNotFoundException e) {Log.e(TAG, "an error occured when collect package info", e);}Field[] fields = Build.class.getDeclaredFields();for (Field field : fields) {try {field.setAccessible(true);infos.put(field.getName(), field.get(null).toString());Log.d(TAG, field.getName() + " : " + field.get(null));} catch (Exception e) {Log.e(TAG, "an error occured when collect crash info", e);}}}/*** 保存错误信息到文件中** @param ex* @return  返回文件名称,便于将文件传送到服务器*/private String saveCrashInfo2File(Throwable ex) {StringBuffer sb = new StringBuffer();for (Map.Entry<String, String> entry : infos.entrySet()) {String key = entry.getKey();String value = entry.getValue();sb.append(key + "=" + value + "\n");}Writer writer = new StringWriter();PrintWriter printWriter = new PrintWriter(writer);ex.printStackTrace(printWriter);Throwable cause = ex.getCause();while (cause != null) {cause.printStackTrace(printWriter);cause = cause.getCause();}printWriter.close();String result = writer.toString();sb.append(result);try {long timestamp = System.currentTimeMillis();String time = formatter.format(new Date());String fileName = "crash-" + time + "-" + timestamp + ".log";if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {String path = "/sdcard/crash/";File dir = new File(path);if (!dir.exists()) {dir.mkdirs();}FileOutputStream fos = new FileOutputStream(path + fileName);fos.write(sb.toString().getBytes());fos.close();}return fileName;} catch (Exception e) {Log.e(TAG, "an error occured while writing file...", e);}return null;}
}

2.定义自己的application类,进行异常处理CrashHandler 初始化

public class App extends Application {/*** 全局Application,方便调用*/public static App application;public SharedPreferences SP;public SharedPreferences.Editor EDIT;public static List<Activity> list_activity;public void onCreate() {super.onCreate();application = this;list_activity=new ArrayList<Activity>();SP = getSharedPreferences("config", MODE_PRIVATE);EDIT = SP.edit();CrashHandler crashHandler = CrashHandler.getInstance();crashHandler.init(application);}/*** 清空退款任务栈,需要在开启每一个activity之后把其加入到list_activity集合中*/public static void RemoveActivity(){if(!list_activity.isEmpty()){//list集合不为空,移除activityfor(Activity activity: list_activity){activity.finish();}}}}

3.清单文件中声明自己的application类,添加这句话
android:name=”.自己的application类”

anddroid异常处理之UncaughtException相关推荐

  1. 有的线程它死了,于是它变成一道面试题

    来自:why不止技术 有些线程它活着,但它躺在池中碌碌无为: 有的线程它死了,于是它变成一道面试题. 这次的文章,要从一次阿里巴巴的面试说起. 我记得那天是周一,刚刚经历过周末过的放松,干劲十足的我正 ...

  2. Android处理崩溃的一些实践

    对于任何程序来说,崩溃都是一件很难避免的事情,当然Android程序也不例外.在Android程序中,引起崩溃的多属于运行时异常或者错误,对于这些异常我们很难做到类似Checked Exception ...

  3. FixedThreadPool吞掉了异常

    2019独角兽企业重金招聘Python工程师标准>>> FixedThreadPool吞掉了异常 为了方便遍描述问题,如下是简化后的 public class RunExceptio ...

  4. 线程执行一半断了_有的线程它死了,于是它变成一道面试题

    ----本文首发于公众号,关注文末公众号阅读体验更佳 有些线程它活着,但它躺在池中碌碌无为: 有的线程它死了,于是它变成一道面试题. 这次的文章,要从一次阿里的面试说起. 我记得那天是周一,刚刚经历过 ...

  5. 手机进入Recovery之 RescueParty

    文章目录 手机进入Recovery之 RescueParty 1. 案例一:三方内置应用频繁Crash导致Recovery 1.1根据现有的log来看: 1.2分析线索如下: 1.3进入重启的函数调用 ...

  6. android 弹出框崩溃_Android处理崩溃的一些实践

    对于任何程序来说,崩溃都是一件很难避免的事情,当然Android程序也不例外.在Android程序中,引起崩溃的多属于运行时异常或者错误,对于这些异常我们很难做到类似Checked Exception ...

  7. 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)

    在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...

  8. JAVA线程池ScheduledExecutorService周期性地执行任务 与单个Thread周期性执行任务的异常处理...

    本文记录: 1,使用ScheduledExecutorService的 scheduleAtFixedRate 方法执行周期性任务的过程,讨论了在任务周期执行过程中出现了异常,会导致周期任务失败. 2 ...

  9. 《高质量java程序设计》读书笔记之----异常处理(1)

    "有所为而有所不为".学会java和学好java并用它设计并实现高效率的程序,这两者相去甚远. 异常处理是java中最强大而又最容易误用的机制.很多人只知道大概的异常处理的语法,却 ...

最新文章

  1. 把文件每行的tab键分隔符改成逗号分隔符
  2. oracle分页置顶,[置顶]       ibatis查询oracle分页
  3. 很有用的X264和ffmpeg的设置
  4. 2018蓝桥杯省赛---java---A---1(分数)
  5. WPF之ComboBox的VisualTreeHelper
  6. springboot——kaptcha
  7. python find函数 和index的区别_使用带有find和index的map时Python2和Python3之间的区别...
  8. ​马卡龙配色你好夏天PPT模板​
  9. jquery级试题_腾讯2020前端面试题含答案解析
  10. Windows下MySQL的详细安装教程
  11. PCI-E 1x, 4x, 8x, 16x 接口定义
  12. 局域网计算机如何传输文件,局域网文件传输,教您局域网如何传输文件
  13. 为什么我的电脑只能上qq不能打开网页
  14. Leveraging Long-Range Temporal Relationships Between Proposals for Video Object Detection论文详读
  15. 社会工程学(安全牛)
  16. 线性代数——对向量的线性组合中的“线性”的理解
  17. 前端自学路线 更新11.11
  18. 07/12/16 资料整理
  19. shell(9): shell脚本安装chajian
  20. 关于博主帅soserious的一些感想.

热门文章

  1. 最小二乘算法MATLAB代码实现
  2. windows 解决 Go下载包失败 设置代理
  3. 编程方法学10:私有变量的重要性
  4. 基于小波变换的图像边缘检测(matlab祖传代码注释)
  5. 科大星云诗社动态20210125
  6. [OS复习]文件管理
  7. 用Delphi实现Windows的鼠标钩子函数
  8. 使用TWebBrowser组件保存网页为html和mht文件 收藏
  9. FFmpeg中的日志以及avio实现对文件的读写功能
  10. C语言解决汉诺塔问题