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


相关文章
|
3月前
|
存储 缓存 JavaScript
Electron V8排查问题之V8FatalErrorCallback崩溃问题的定义如何解决
Electron V8排查问题之V8FatalErrorCallback崩溃问题的定义如何解决
41 0
|
6月前
|
JavaScript IDE Java
bugly崩溃排查3:观察是谁调用了崩溃函数
bugly崩溃排查3:观察是谁调用了崩溃函数
73 0
|
运维 监控 前端开发
记一次线上 bug 的排查分析过程及总结
记一次线上 bug 的排查分析过程及总结
记一次线上 bug 的排查分析过程及总结
|
消息中间件 运维 监控
线上踩坑记:项目中一次OOM的分析定位排查过程!
线上踩坑记:项目中一次OOM的分析定位排查过程!
|
存储 测试技术
kindle 应用程序出错,无法启动选定的应用程序,请重试。问题排查过程及处理方案。...
kindle 应用程序出错,无法启动选定的应用程序,请重试。问题排查过程及处理方案。...
523 0
|
SQL 关系型数据库 MySQL
MySQL大无语事件:一次生产环境的死锁事故,看看我怎么排查
今天要分享的是在生产环境中出现的一次算得上比较诡异的死锁事件, 不过庆幸的是没有产生较大的业务损失.
|
Java
如何排查Java内存泄露(内附各种排查工具介绍)
今天刚刚才加一个故障review会议, 故障非常典型, 在google也可以找到相似案例介绍。 在排查问题的过程中,使用了大量的工具, 发现有问题的地方还不只一个,总结一下. (本篇文章不会重点描述案例本身,重点会介绍个人对java内存泄露问题的排查思路和各种工具的使用)。
22061 0
|
JSON Java 程序员
写了这么久的业务连异常都不知道怎么处理吗
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
218 0
|
存储 Java Android开发
【吐血🤮】一次生产环境NPE崩溃的排查记录(中)
直接说引起NPE的根本原因: rx订阅没有取消,回调时Fragment已经被回收,引用view调更新方法,自然NPE。
168 0