Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > Android全局异常

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

作者:双鱼大猫

这篇文章主要为大家详细介绍了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全局异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文