可通过thread.setdefaultuncaughtexceptionhandler设兜底处理器,并配合自定义threadfactory为所有新线程统一注入处理器;android需额外在application.oncreate中尽早设置,且对rxjava/coroutines等框架配置全局错误处理器。

可以通过 Thread.setUncaughtExceptionHandler() 为单个线程设置崩溃处理器,但要实现“全局”拦截子线程崩溃,关键在于**对所有新创建的线程统一设置处理器**——最可靠的方式是配合 ThreadFactory 使用,并在应用启动时为 Thread.setDefaultUncaughtExceptionHandler() 设置兜底处理器。
设置默认未捕获异常处理器(兜底方案)
这是最基础的全局保障:只要线程没显式设置自己的处理器,就会走这个默认处理器。
注意:它只对未显式调用 setUncaughtExceptionHandler() 的线程生效,且不能覆盖主线程(主线程有独立机制)。
Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> {
Log.e("CrashHandler", "Uncaught exception in thread: " + thread.getName(), throwable);
// 上报、保存日志、退出等操作
});
通过自定义 ThreadFactory 统一注入处理器(推荐主用)
适用于你控制线程创建的场景(如使用 ExecutorService、手动 new Thread 等)。所有通过该 factory 创建的线程都会自动带上你的处理器。
ThreadFactory crashAwareFactory = r -> {
Thread t = new Thread(r);
t.setUncaughtExceptionHandler((thread, ex) -> {
Log.w("CrashHandler", "Crash in custom thread: " + thread.getName(), ex);
// 做统一处理:上报、记录堆栈、触发重启逻辑等
});
return t;
};
// 示例:用于 Executors
ExecutorService executor = Executors.newFixedThreadPool(3, crashAwareFactory);
Android 中需额外注意主线程和 Looper 子线程
Android 的 UI 线程(主线程)崩溃不会走 setDefaultUncaughtExceptionHandler,它由 Looper.getMainLooper().setMessageLogging() 或更常用的是 Thread.setDefaultUncaughtExceptionHandler() 配合 ActivityThread 初始化时机来覆盖 —— 但更稳妥的做法是在 Application#onCreate 中尽早设置:
- 调用
Thread.setDefaultUncaughtExceptionHandler()(覆盖非主线程) - 对
HandlerThread、IntentService(已废弃)、WorkManager后台线程等,确保它们也使用带 handler 的ThreadFactory - 避免在子线程中 throw RuntimeException 后不处理;若用 RxJava / Coroutines,应配置全局错误处理器(如
RxJavaPlugins.setErrorHandler()或CoroutineExceptionHandler)
实际处理建议(不止于打印日志)
真正有用的崩溃处理应包含:
- 立即记录完整堆栈(含线程名、时间、内存状态)到本地文件
- 异步上报至监控平台(注意避免在崩溃线程里做网络请求,应交由独立守护线程或进程)
- 防止重复崩溃导致卡死:可记录崩溃次数,达到阈值后主动退出进程
- 必要时弹出友好提示(仅限 UI 线程,子线程不可直接 show Toast)










