Android 统一捕获异常
添加统一处理异常的逻辑,并且可使应用不出现崩溃的现象。
//核心类
object Global {
private const val TAG = "Global"
private val handler = Handler(Looper.getMainLooper())
//这种方式会使主线程中looper的调用栈加深一层。出现异常的时候catch住并再次主动调用 Looper.loop()
fun loop() {
handler.post {
while (true) {
try {
Looper.loop()
} catch (e: Throwable) {
dealStackTraceException(e)
}
}
}
}
/**
* 统一处理异常
*/
@Throws(Throwable::class)
private fun dealStackTraceException(e: Throwable) {
val stack = Log.getStackTraceString(e)
Log.w(TAG,e)
if (stack.contains("xxx.xxx()") ) {
//希望捕获住的特定异常
} else {
//不希望捕获的直接抛出异常
throw e
}
}
}
//具体的使用 在Application的attachBaseContext中
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
context = this
}
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
//启动loop
Global.loop()
}
companion object {
lateinit var context: Context
}
}