【吐血🤮】一次生产环境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定位错误有所帮助


相关文章
|
1月前
|
SQL 存储 监控
实用技巧:排查数据异常/数据波动问题,该如何下手?
在我做开发的这些年,让我很头痛的一类问题,不是线上故障,而是数据异常,不知道有没有程序员跟我感同身受。大多数的服务故障都有较为直观的异常日志,再结合产品表象,相对排查起来还有迹可循,但数据异常的原因就太多了,很多时候连报错日志都没有,排查起来简直无从下手。
实用技巧:排查数据异常/数据波动问题,该如何下手?
|
4月前
|
JavaScript IDE Java
bugly崩溃排查3:观察是谁调用了崩溃函数
bugly崩溃排查3:观察是谁调用了崩溃函数
23 0
|
9月前
|
Java Linux
|
SQL 关系型数据库 MySQL
MySQL大无语事件:一次生产环境的死锁事故,看看我怎么排查
今天要分享的是在生产环境中出现的一次算得上比较诡异的死锁事件, 不过庆幸的是没有产生较大的业务损失.
|
存储 Java Android开发
【吐血🤮】一次生产环境NPE崩溃的排查记录(中)
直接说引起NPE的根本原因: rx订阅没有取消,回调时Fragment已经被回收,引用view调更新方法,自然NPE。
127 0
|
测试技术 Kotlin
【吐血🤮】一次生产环境NPE崩溃的排查记录(上)
直接说引起NPE的根本原因: rx订阅没有取消,回调时Fragment已经被回收,引用view调更新方法,自然NPE。
227 0
|
Java 测试技术
你敢信?String类竟然是导致生产环境频繁内存溢出的罪魁祸首!!
最近,一名小伙伴跟我说:他写的程序在测试环境一点问题没有,但是发到生产环境却会频繁出现内存溢出的情况,这个问题都困扰他一周多了。于是乎,周末我便开始帮他排查各种问题。
185 0
你敢信?String类竟然是导致生产环境频繁内存溢出的罪魁祸首!!
|
Web App开发 运维 安全
印象最深的一个bug——排查修复问题事件BEX引发的谷歌浏览器闪退崩溃异常
本文记录了目前修复的千千万万个项目的BUG中印象最深的一次BUG,由于问题事件BEX引发的谷歌浏览器闪退崩溃的异常问题.这个BUG因为其不可复现性导致特别难以发现和解决,正是由于这一次的BUG解决过程,让我了解到了一位攻城狮在项目开发维护过程中实际经验的重要性,多思考,多实践,多多积累经验,才是一位攻城狮的成长之路.
30578 2
印象最深的一个bug——排查修复问题事件BEX引发的谷歌浏览器闪退崩溃异常
|
小程序 安全 专有云
排查指南 | mPaaS 小程序提示“网络不给力”时该如何排查?
从此,Android 应用打开 mPaaS 小程序,告别“网络不给力”
3163 0
排查指南 | mPaaS 小程序提示“网络不给力”时该如何排查?