一般情况下我们想要捕获全局异常会调用Thread.setDefaultUncaughtExceptionHandler
方法;这个方法虽然能捕获所有线程的异常,但如果是主线程发生未捕获异常,APP虽然不会崩溃,但是主线程的Looper会跳出循环,导致无法继续处理消息,无法与APP进行交互,处于一种假死状态;
想要主线程不崩溃,可以在自定义Application
加上下面这段代码:
Handler(Looper.getMainLooper()).post() {
while (true) {
try {
Looper.loop()
} catch (e: Throwable) {
Log.e("Crash【主线程】", e.message ?: "")
}
}
}
就是向主线程发送一个我们自定义的Message
,这个Message
里因为有while
死循环,所以这个Message永远不会执行完,这就相当于把ActivityThread
里调用的Looper.loop()
方法阻塞死了,然后我们再调用Looper.loop()
方法开启新的循环去不断处理主线程上的Message
,并用try catch
捕获到主线程异常;当主线程发生异常时,会执行下一次while
循环再次调用Looper.loop()
方法处理主线程消息,这样程序就不会因为主线程结束而导致APP崩溃
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)