一文吃透Android如何處理全局異常
一句話總結:全局異常處理就像給 App 裝“安全網”——兜住所有未捕獲的崩潰,記錄日志、上報服務器,然后優(yōu)雅退出,避免用戶看到丑丑的“已停止運行”!
一、核心實現(xiàn)(三步搞定安全網)
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. 優(yōu)雅退出(可選重啟)
exitAppGracefully()
// 4. 調用默認處理器(觸發(fā)崩潰彈窗)
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(),否則系統(tǒng)服務可能異常!
主線程崩潰的特殊處理:
主線程崩潰后,默認會殺進程,若想重啟 Activity 需用 Handler 延遲執(zhí)行:
Handler(Looper.getMainLooper()).post {
// 重啟 MainActivity
}
第三方 SDK 的處理:
某些 SDK(如 Firebase Crashlytics)會覆蓋默認處理器,需在初始化 SDK 后設置自定義處理器。
三、進階技巧(增強版安全網)
記錄設備信息: 崩潰時附帶設備型號、系統(tǒng)版本等。
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: 支持跨平臺崩潰監(jiān)控,提供實時報警。
ACRA: 開源崩潰報告庫,可自定義上報服務器。
到此這篇關于一文吃透Android如何處理全局異常的文章就介紹到這了,更多相關Android全局異常內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android自定義view實現(xiàn)電影票在線選座功能
這篇文章主要為大家詳細介紹了Android自定義view實現(xiàn)選座功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11
Android開發(fā)實現(xiàn)應用層面屏蔽狀態(tài)欄的方法小結
這篇文章主要介紹了Android開發(fā)實現(xiàn)應用層面屏蔽狀態(tài)欄的方法,結合實例形式分析了Android屏蔽狀態(tài)欄的相關函數(shù)調用、權限控制及函數(shù)重寫等相關操作技巧,需要的朋友可以參考下2017-08-08
解決AndroidStudio無法運行java中的mian方法問題
這篇文章主要介紹了解決AndroidStudio無法運行java中的mian方法問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
Android 使用 okhttp3和retrofit2 進行單文件和多文件上傳
這篇文章主要介紹了Android 使用 okhttp3和retrofit2 進行單文件和多文件上傳,開發(fā)項目中需要進行單文件多文件的上傳功能,下面演示的ApiResponse是自己分裝的返回值,要根據(jù)自己的項目來完成,需要的朋友可以參考下2022-10-10

