一文吃透Android如何處理全局異常
一句話總結(jié):全局異常處理就像給 App 裝“安全網(wǎng)”——兜住所有未捕獲的崩潰,記錄日志、上報服務(wù)器,然后優(yōu)雅退出,避免用戶看到丑丑的“已停止運(yùn)行”!
一、核心實(shí)現(xiàn)(三步搞定安全網(wǎng))
1. 自定義崩潰處理器(繼承 UncaughtExceptionHandler)
class GlobalCrashHandler : Thread.UncaughtExceptionHandler { // 原生的默認(rèn)處理器(最后要交給它處理) private val defaultHandler = Thread.getDefaultUncaughtExceptionHandler() override fun uncaughtException(thread: Thread, throwable: Throwable) { // 1. 記錄崩潰日志 logCrash(throwable) // 2. 上傳到服務(wù)器 uploadCrash(throwable) // 3. 優(yōu)雅退出(可選重啟) exitAppGracefully() // 4. 調(diào)用默認(rèn)處理器(觸發(fā)崩潰彈窗) defaultHandler?.uncaughtException(thread, throwable) } private fun logCrash(e: Throwable) { Log.e("Crash", "全局崩潰: ", e) } private fun uploadCrash(e: Throwable) { // 使用 Retrofit 或 OkHttp 上報到服務(wù)器 } private fun exitAppGracefully() { // 關(guān)閉所有 Activity android.os.Process.killProcess(android.os.Process.myPid()) System.exit(1) } }
2. 在 Application 中注冊全局處理器
class MyApp : Application() { override fun onCreate() { super.onCreate() // 設(shè)置全局異常捕獲 Thread.setDefaultUncaughtExceptionHandler(GlobalCrashHandler()) } }
3. AndroidManifest 中指定 Application 類
<application android:name=".MyApp" ...> </application>
二、注意事項(xiàng)(避坑指南)
不要吃掉異常: 必須調(diào)用默認(rèn)處理器的 uncaughtException()
,否則系統(tǒng)服務(wù)可能異常!
主線程崩潰的特殊處理:
主線程崩潰后,默認(rèn)會殺進(jìn)程,若想重啟 Activity 需用 Handler
延遲執(zhí)行:
Handler(Looper.getMainLooper()).post { // 重啟 MainActivity }
第三方 SDK 的處理:
某些 SDK(如 Firebase Crashlytics)會覆蓋默認(rèn)處理器,需在初始化 SDK 后設(shè)置自定義處理器。
三、進(jìn)階技巧(增強(qiáng)版安全網(wǎng))
記錄設(shè)備信息: 崩潰時附帶設(shè)備型號、系統(tǒng)版本等。
private fun collectDeviceInfo(): Map<String, String> { return mapOf( "Model" to Build.MODEL, "Android Version" to Build.VERSION.RELEASE ) }
本地保存崩潰日志: 避免網(wǎng)絡(luò)問題導(dǎo)致日志丟失。
private fun saveCrashToFile(e: Throwable) { val log = "Crash: ${e.stackTraceToString()}" File(cacheDir, "crash.log").writeText(log) }
用戶友好提示: 捕獲崩潰后彈出 Toast 或跳轉(zhuǎn)到錯誤頁。
private fun showUserFriendlyMessage() { Toast.makeText(this, "程序遇到問題,即將重啟", Toast.LENGTH_SHORT).show() }
四、第三方庫推薦(省力工具)
Firebase Crashlytics: 自動捕獲崩潰,提供詳細(xì)分析面板。
// build.gradle implementation 'com.google.firebase:firebase-crashlytics-ktx:18.6.0'
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true)
Bugsnag: 支持跨平臺崩潰監(jiān)控,提供實(shí)時報警。
ACRA: 開源崩潰報告庫,可自定義上報服務(wù)器。
到此這篇關(guān)于一文吃透Android如何處理全局異常的文章就介紹到這了,更多相關(guān)Android全局異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android Studio 下自動注釋(自定義作者,類作用等)圖文詳解
android studio 下自動注釋功能居然被隱藏了,很多功能都不見了,下面小編通過本文給大家分享Android Studio 下自動注釋(自定義作者,類作用等)圖文詳解,需要的朋友參考下吧2017-11-11android TextView中識別多個url并分別點(diǎn)擊跳轉(zhuǎn)方法詳解
在本篇文章里小編給大家整理的是關(guān)于android TextView中識別多個url并分別點(diǎn)擊跳轉(zhuǎn)方法詳解,需要的朋友們可以學(xué)習(xí)參考下。2019-08-08Android中實(shí)現(xiàn)GPS定位的簡單例子
這篇文章主要介紹了Android中實(shí)現(xiàn)GPS定位的簡單例子,例子邏輯清晰,但相對簡單了些,需要的朋友可以參考下2014-07-07Android StepView實(shí)現(xiàn)物流進(jìn)度效果
這篇文章主要為大家詳細(xì)介紹了Android StepView實(shí)現(xiàn)物流進(jìn)度效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05超精準(zhǔn)的Android手機(jī)計步器開發(fā)
這篇文章主要為大家詳細(xì)介紹了超精準(zhǔn)的Android手機(jī)計步器開發(fā)過程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10android使用PullToRefresh框架實(shí)現(xiàn)ListView下拉刷新上拉加載更多
這篇文章主要介紹了android使用PullToRefresh框架實(shí)現(xiàn)ListView下拉刷新上拉加載更多,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12