Android中的线程捕获

作者: pphdsny | 来源:发表于2019-07-30 15:50 被阅读16次

前言

最近上的一个版本中,突然bugly的Java异常一个都没有了,正好升级了bugly的版本,还以为接入有问题,排查一些正常,特自信的说版本代码优秀…0 bug~~~

可是后面细想几百万的DAU,一个Java异常都没有都没有,这太不正常了。

目前项目中捕获全局异常的有:bugly、umeng、自己。

排查

bugly的捕获异常代码实现

文件路径:com.tencent.bugly.crashreport.crash.a

设置全局异常捕获

保存之前的UncaughtExceptionHandler ,将自己设置为默认异常处理器Thread.setDefaultUncaughtExceptionHandler(this)

异常捕获 异常分发

对捕获异常做分发

umeng的捕获异常代码实现

文件路径:com.umeng.analytics.pro.l

umeng的UncaughtExceptionHandler

实现逻辑和bugly类似

自己的捕获异常代码实现

自己的UncaughtExceptionHandler

问题定位:handleException笔误写错了!处理,导致之前默认异常处理未被调用,而且自己异常捕获写在最后,覆盖了之前的异常捕获

建议

为了避免此种问题再次发生,对异常捕获可以参考以下代码进行扩展

public class CrashHandler implements Thread.UncaughtExceptionHandler {

    private final Thread.UncaughtExceptionHandler mDefaultHandler;

    public CrashHandler() {
      //缓存之前的默认异常捕获
        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    @Override
    public void uncaughtException(Thread t, Throwable e) {
      //分发异常
        if (mDefaultHandler != null) {
            mDefaultHandler.uncaughtException(t, e);
        }
      //TODO 自己处理
        Log.w("CrashHandler", e);
    }
}

当然最简单的方式是将自己的UncaughtExceptionHandler写在buglyumeng的前面,让buglyumeng分发异常给自己,但是你也不能保证你前面就没有其他的异常捕获监听,所以还是建议用上述方法。

扩展

  • Java中并不是所有的异常都会提示try-catch进行捕获的,比如RuntimeException
  • 线程是独立执行的代码片断,线程的问题应该由线程自己来解决,而不要委托到外部。

setUncaughtExceptionHandler

  • 对象方法
  • 用于指定Thread的异常捕获
  • 如未指定会去取ThreadPool中的异常捕获
  • 只能捕获executorService.execute执行的异常
  • 不能捕获executorService.submit(runnable),上述异常通过catch (ExecutionException e)进行捕获

setDefaultUncaughtExceptionHandler

  • 类方法
  • 用于捕获所有Thread中的异常捕获
  • 如Thread指定了异常捕获,则不调用默认的

相关文章

  • Android中的线程捕获

    前言 最近上的一个版本中,突然bugly的Java异常一个都没有了,正好升级了bugly的版本,还以为接入有问题,...

  • Java多线程: 如何捕获多线程中的异常

    你处理过多线程中异常吗?如何捕获多线程中发生的异常?捕获子线程的异常与捕获当前线程的异常一样简单吗? 除了try ...

  • 2019-12-20

    1、多线程中怎么捕获子线程中的异常?这个问题大家会经常遇到,子线程在执行过程中抛出了异常,但是主线程并没有捕获到。...

  • 笔记:Android线程和线程池

    Android线程和线程池 Android中的线程操作相关的类有 AsyncTask IntentService ...

  • Android中的线程和线程池

    Android中的线程 线程,在Android中是非常重要的,主线程处理UI界面,子线程处理耗时操作。如果在主线程...

  • 多线程的异常和事务

    子线程中的异常在主线程中是不可以catch的在spring中主线程有事务,那么子线程中有事务么? 捕获异常 我们使...

  • Android 开发艺术探索读书笔记 11 -- Android

    本篇文章主要介绍以下几个知识点:主线程和子线程Android 中的线程形态Android 中的线程池 11.1 主...

  • Android线程池的使用

    一、线程与线程池,为什么要使用线程池 1、Android中的线程 在Android中有主线程和子线程的区分。主线程...

  • 深度解析多线程带来的Android性能优化原理

    Android 开发中多线程的必要性; Android 开发中,许多操作都需要由 主线程(UI 线程)来执行,比如...

  • Java如何捕获线程异常

    首先,我们要知道,在Java中,线程中的异常是不能抛出到调用该线程的外部方法中捕获的。 为什么不能抛出到外部线程捕...

网友评论

    本文标题:Android中的线程捕获

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