【吐血🤮】一次生产环境NPE崩溃的排查记录(下)

简介: 直接说引起NPE的根本原因: rx订阅没有取消,回调时Fragment已经被回收,引用view调更新方法,自然NPE。

页面的话三层嵌套:CustomerFragment → ThirdAgentListFragment → CustomerChildNewFragment


接着模拟崩溃,看日志输出结果分析:


网络异常,图片无法展示
|


不难看出Activity重建的时候把Fragment都恢复了,但是很快又销毁掉了,正常来说恢复Fragment的流程:


onCreateView() → onViewCreated() → onActivityCreated() → 各种初始化操作


这里却直接马上走onDestoryView()也走了onDestory(),发生这个原因其实是replace,看回代码:


网络异常,图片无法展示
|


调用FragmentManager的replace()方法,而正常两个Fragment走的生命周期(未调用addToBackStack):


  • 被替换Fragment:onPause() → onStop() → onDestroyView() → onDestroy() → onDetach()


  • 替换Fragment:onAttach() → onCreate() → onCreateView() → onViewCreated() → onActivityCreated() → onStart() → onResume()


所以,这里的实际逻辑是这样:


恢复的方式创建了Fragment → 创建新的Fragment → 替换掉Fragment → 恢复创建的Fragment被干掉


然后,我在Fragment的onActivityCreated()中又发起了一个请求,那就存在一种情况:请求发出去了,响应还没回来,Fragment就被替换干掉了,这个时候去调已经销毁的Fragment里的View实例,妥妥滴空指针啊!


一种看似取巧的解决方式:savedInstanceState(Bundle) 方法中判断参数是否为空,不为空就不加载请求:


网络异常,图片无法展示
|


当然,治本的方法肯定是从网络请求入手,当Activity或Fragment销毁时,需要把rx的订阅都取消掉,方法就是开头说的几种。


项目都四五年了,竟然一直没爆这个BUG,大概的原因是:


单Activity、多Fragment玩法,没有频繁的replace() Fragment的场景,而且大部分请求都有不可取消的Loading。


排查了一天,原来就是这样一个简单的BUG,前人挖坑,后人填坑,真是一口老血...


不过在排查过程中也收获不少:


  • 了解KAE不用findViewById的原理,以后可以放心使用了;


  • ViewBinding有个大概了解;


  • 对Fragment生命周期的验证(平时都是死记);


  • 了解了一下Activity具体重建机制;


就说这么多,解BUG之路道阻且跻,希望本文对你日常的Debug定位错误有所帮助


相关文章
|
8月前
|
测试技术
无法复现的bug,如何处理?
无法复现的bug,如何处理?
567 0
|
8月前
|
JavaScript IDE Java
bugly崩溃排查3:观察是谁调用了崩溃函数
bugly崩溃排查3:观察是谁调用了崩溃函数
93 0
|
运维 监控 前端开发
记一次线上 bug 的排查分析过程及总结
记一次线上 bug 的排查分析过程及总结
记一次线上 bug 的排查分析过程及总结
|
Java Linux
生产环境OOM问题的排查记录
生产环境OOM问题的排查记录
210 1
|
消息中间件 运维 监控
线上踩坑记:项目中一次OOM的分析定位排查过程!
线上踩坑记:项目中一次OOM的分析定位排查过程!
|
SQL 关系型数据库 MySQL
MySQL大无语事件:一次生产环境的死锁事故,看看我怎么排查
今天要分享的是在生产环境中出现的一次算得上比较诡异的死锁事件, 不过庆幸的是没有产生较大的业务损失.
|
安全 Java
Java开发过程中 异常及日常如何规避
Java开发过程中 异常及日常如何规避
|
测试技术 Kotlin
【吐血🤮】一次生产环境NPE崩溃的排查记录(上)
直接说引起NPE的根本原因: rx订阅没有取消,回调时Fragment已经被回收,引用view调更新方法,自然NPE。
302 0
|
存储 Java Android开发
【吐血🤮】一次生产环境NPE崩溃的排查记录(中)
直接说引起NPE的根本原因: rx订阅没有取消,回调时Fragment已经被回收,引用view调更新方法,自然NPE。
178 0
|
Web App开发 运维 安全
印象最深的一个bug——排查修复问题事件BEX引发的谷歌浏览器闪退崩溃异常
本文记录了目前修复的千千万万个项目的BUG中印象最深的一次BUG,由于问题事件BEX引发的谷歌浏览器闪退崩溃的异常问题.这个BUG因为其不可复现性导致特别难以发现和解决,正是由于这一次的BUG解决过程,让我了解到了一位攻城狮在项目开发维护过程中实际经验的重要性,多思考,多实践,多多积累经验,才是一位攻城狮的成长之路.
30780 2
印象最深的一个bug——排查修复问题事件BEX引发的谷歌浏览器闪退崩溃异常