一文吃透Android如何处理全局异常

 更新时间:2025年02月19日 08:23:04   作者:双鱼大猫  
这篇文章主要为大家详细介绍了Android中处理全局异常的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

一句话总结:全局异常处理就像给 App 装“安全网”——兜住所有未捕获的崩溃,记录日志、上报服务器,然后优雅退出,避免用户看到丑丑的“已停止运行”!

一、核心实现(三步搞定安全网

1. 自定义崩溃处理器(继承 UncaughtExceptionHandler)

class GlobalCrashHandler : Thread.UncaughtExceptionHandler {  
    // 原生的默认处理器(最后要交给它处理)  
    private val defaultHandler = Thread.getDefaultUncaughtExceptionHandler()  

    override fun uncaughtException(thread: Thread, throwable: Throwable) {  
        // 1. 记录崩溃日志  
        logCrash(throwable)  
        // 2. 上传到服务器  
        uploadCrash(throwable)  
        // 3. 优雅退出(可选重启)  
        exitAppGracefully()  
        // 4. 调用默认处理器(触发崩溃弹窗)  
        defaultHandler?.uncaughtException(thread, throwable)  
    }  

    private fun logCrash(e: Throwable) {  
        Log.e("Crash", "全局崩溃: ", e)  
    }  

    private fun uploadCrash(e: Throwable) {  
        // 使用 Retrofit 或 OkHttp 上报到服务器  
    }  

    private fun exitAppGracefully() {  
        // 关闭所有 Activity  
        android.os.Process.killProcess(android.os.Process.myPid())  
        System.exit(1)  
    }  
}  

2. 在 Application 中注册全局处理器

class MyApp : Application() {  
    override fun onCreate() {  
        super.onCreate()  
        // 设置全局异常捕获  
        Thread.setDefaultUncaughtExceptionHandler(GlobalCrashHandler())  
    }  
}  

3. AndroidManifest 中指定 Application 类

<application  
    android:name=".MyApp"  
    ...>  
</application>  

二、注意事项(避坑指南)

不要吃掉异常:  必须调用默认处理器的 uncaughtException(),否则系统服务可能异常!

主线程崩溃的特殊处理:

主线程崩溃后,默认会杀进程,若想重启 Activity 需用 Handler 延迟执行:

Handler(Looper.getMainLooper()).post {  
    // 重启 MainActivity  
}  

第三方 SDK 的处理:

某些 SDK(如 Firebase Crashlytics)会覆盖默认处理器,需在初始化 SDK 后设置自定义处理器。

三、进阶技巧(增强版安全网)

记录设备信息:  崩溃时附带设备型号、系统版本等。

private fun collectDeviceInfo(): Map<String, String> {  
    return mapOf(  
        "Model" to Build.MODEL,  
        "Android Version" to Build.VERSION.RELEASE  
    )  
}  

本地保存崩溃日志:  避免网络问题导致日志丢失。

private fun saveCrashToFile(e: Throwable) {  
    val log = "Crash: ${e.stackTraceToString()}"  
    File(cacheDir, "crash.log").writeText(log)  
}  

用户友好提示:  捕获崩溃后弹出 Toast 或跳转到错误页。

private fun showUserFriendlyMessage() {  
    Toast.makeText(this, "程序遇到问题,即将重启", Toast.LENGTH_SHORT).show()  
}  

四、第三方库推荐(省力工具)

Firebase Crashlytics:  自动捕获崩溃,提供详细分析面板。

// build.gradle  
implementation 'com.google.firebase:firebase-crashlytics-ktx:18.6.0'  
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true)  

Bugsnag:  支持跨平台崩溃监控,提供实时报警。

ACRA:  开源崩溃报告库,可自定义上报服务器。

到此这篇关于一文吃透Android如何处理全局异常的文章就介绍到这了,更多相关Android全局异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入理解Android手势识别

    深入理解Android手势识别

    这篇文章主要帮助大家深入理解Android手势识别,创建手势侦听对象,设置手势识别,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Android自定义view实现电影票在线选座功能

    Android自定义view实现电影票在线选座功能

    这篇文章主要为大家详细介绍了Android自定义view实现选座功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android仿微信雷达扫描效果的实现方法

    Android仿微信雷达扫描效果的实现方法

    最近看了一个视频讲了一种微信雷达扫描的实现方案,借鉴了一下,自己也写一个玩玩,所以下面这篇文章主要给大家介绍了利用Android模仿微信雷达扫描效果的实现方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-06-06
  • Flutter 包管理器和资源管理使用学习

    Flutter 包管理器和资源管理使用学习

    这篇文章主要为大家介绍了Flutter 包管理器和资源管理使用学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Android开发实现应用层面屏蔽状态栏的方法小结

    Android开发实现应用层面屏蔽状态栏的方法小结

    这篇文章主要介绍了Android开发实现应用层面屏蔽状态栏的方法,结合实例形式分析了Android屏蔽状态栏的相关函数调用、权限控制及函数重写等相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • Android实现验证码登录

    Android实现验证码登录

    这篇文章主要为大家详细介绍了Android实现验证码登录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • 解决AndroidStudio无法运行java中的mian方法问题

    解决AndroidStudio无法运行java中的mian方法问题

    这篇文章主要介绍了解决AndroidStudio无法运行java中的mian方法问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Android自定义弹出框dialog效果

    Android自定义弹出框dialog效果

    这篇文章主要为大家详细介绍了Android自定义弹出框dialog效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Kotlin的枚举与异常示例详解

    Kotlin的枚举与异常示例详解

    这篇文章主要给大家介绍了关于Kotlin的枚举与异常的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Kotlin具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • Android 使用 okhttp3和retrofit2 进行单文件和多文件上传

    Android 使用 okhttp3和retrofit2 进行单文件和多文件上传

    这篇文章主要介绍了Android 使用 okhttp3和retrofit2 进行单文件和多文件上传,开发项目中需要进行单文件多文件的上传功能,下面演示的ApiResponse是自己分装的返回值,要根据自己的项目来完成,需要的朋友可以参考下
    2022-10-10

最新评论