赞
踩
通常我们在可以预见的可能出现异常的手动调用try catch来捕获代码片中的异常,防止app直接崩溃,或者即使没有try catch,通常崩溃以后,日志里会打出具体的异常信息,并提示具体在哪一个类,哪一行出现错
但博主之前遇到的问题就不在此类范围之内,app直接崩溃,并且没有明显的异常信息,且看error信息
提示Channel is unrecoverably broken and will be disposed!,上stackoverflow上搜索关键词,找不到答案,当然不能死心,在反复的crash后(在不知道原因的时候简直迷之bug,同样的操作,有时候这样的日志,有时候那样的日志),终于找到了有用的信息
切换到Verbose级别的日志,看到了thread exiting with uncaught exception,翻译过来就是线程未捕获到的异常,正好对应了每次crash以后,进程就挂了,那么为什么是未捕获到的异常,我非要去捕获他!知道是什么异常才知道怎么去解决
一番搜索过后,找到了出现此类问题以后,极有可能是“线程池中,线程池在执行任务时捕获了所有异常,这样一来线程中所有的异常都无法捕获到抛出的异常”。
很庆幸,android给我们提供了去捕获这类异常的接口,如下图
我这是让BaseActivity去实现了UncaughtExceptionHandler这个接口,并重写uncaughtException这个方法,最后在oncreat去调用如上的所示的方法,这样就可以捕获到异常了。
那么重新让程序crash以后,打印出了以下日志
Only the original thread that created a view hierarchy can touch its views
意思是我在子线程去更新了UI,众所周知更新UI的操作要放在主线程去执行,知道异常以后,结合在什么地方崩溃,就可以极大的缩小问题出现的可能范围
PS:最后是我之前代码里的迷之操作,在子线程里里写了adapter.notifyDataSetChanged()这个方法,会让adapter去刷新view(拍胸脯保证,我都不知道当时为啥加了这句 )
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。