温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Android主线程崩溃与子线程崩溃有的本质区别是什么

发布时间:2021-10-21 13:48:44 来源:亿速云 阅读:217 作者:iii 栏目:移动开发

这篇文章主要介绍“Android主线程崩溃与子线程崩溃有的本质区别是什么”,在日常操作中,相信很多人在Android主线程崩溃与子线程崩溃有的本质区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android主线程崩溃与子线程崩溃有的本质区别是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

问答环节

问:Android 主线程崩溃与子线程崩溃有什么本质区别?

答:子线程崩溃就是正常的 Java thread 样子,通过 setDefaultUncaughtExceptionHandler 就能捕获  ThreadGroup 里对应子线程的异常做后续处理(启动独立进程提醒用户并上报平台等,或者通过策略下发忽略特定异常当作没发生一样)。安卓中主线程的 Crash  和子线程 Crash 有一点差异,虽然本质都是通过 setDefaultUncaughtExceptionHandler  就能捕获,但是这背后其实是有一点窍门的。由于 Android 主线程启动后通过 MainHandler 的 Looper.loop()  一直保持管道阻塞式的生产消费者死循环,所有的主线程代码都是通过这个循环派发在 MainLooper 中执行的,所以当主线程 crash  的场景下,这个循环会被跳出,导致 Looper 无法再继续执行其中的其他 Message,所以当主线程 crash 时会出现几种不同的表现,场景的一种就是在  Activity 的 onCreate 中 crash 会导致界面黑屏(注意,这种 crash 不是 anr,是因为 onCreate  中抛出异常导致后续代码无法执行,也就是 Activity 生命周期框架代码无法继续,同时后续 Message 也无法正常派发,所以界面还没出来就黑屏了),而  View 点击事件响应中 crash 可能不会黑屏(也可能会,取决于做什么操作),但是后续 Message 也是无法正常派发。

拓展环节
问:针对上面描述你有什么想法?

答:子线程奔溃没啥说的,由于主线程发生了崩溃会导致 Looper 退出,所以我们可以在主线程启动一个我们自带 try-catch 的  Looper.loop() 去执行主线程任务,相当于这样我们通过带 try-catch 的 loop() 替换掉了 ActivityThread main  里面那个 Looper.loop(),这样就不会出现主线程崩溃后 loop 退出了,也就能继续执行代码了,只是当次 crash  的场景可能是无效的,譬如用户点击按钮设置文案 crash 了,点了可能没反应;同时点击按钮启动的 Activity 的 onCreate 等方法里面有  crash 则会导致黑屏,所以这种 crash 需要区分对待(譬如上报异常并弹框提醒并直接杀掉进程等)。

下面是核心代码的简单实现(Activity 生命周期处理的比较粗略,仅供 demo):

// Application 启动就进行替换 new Handler(getMainLooper()).post(new Runnable() {     @Override     public void run() {         // 每次蹦了就继续重新循环,保证永远都能 loop         while (true) {             try {                 Looper.loop();             } catch (Throwable e) {                 e.printStackTrace();                 // TODO 手动上报错误到异常管理平台,做交互处理等                 if (e.getMessage() != null && e.getMessage().startsWith("Unable to start activity")) {                     // TODO 来自 Activity 生命周期崩溃,杀死进程                     android.os.Process.killProcess(android.os.Process.myPid());                     break;                 }             }         }     } });

当然,针对 Activity 生命周期方法内的 crash 黑屏我们除过判断堆栈日志方式,还能通过 hook  ActivityThread 的 mH 主 Handler 实现,将里面的 Message handle 函数托管我们实现,然后进行 try-catch  捕获,发现异常就 close 对应 Activity 或者 kill app 即可

到此,关于“Android主线程崩溃与子线程崩溃有的本质区别是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI