项目疑难杂症记录(一):fragment单例导致的界面异常

前言:之前项目中也会遇到一些头疼的问题或者难解的bug,有些可能花费不少时间精力解决了,但是没有记录,打算从本篇博客开始,记录下项目中遇到的我认为的疑难杂症,算是对自己学习的总结,如果凑巧你也看到了,并且对你有一定的帮助,那将会是一件很有意义的事情。

最近同事做Tv项目,遇到了界面上一个奇怪的并且百思不得其解的现象,请我帮忙分析解决,先看下面的一个出现问题的效果图
在这里插入图片描述

进去注册页面,每个控件的值不完全一样,然后退出,再次进入注册页面,每个控件的值竟然完全一样。
一、问题初步排查定位思路:
1、代码逻辑错误导致数据保存一样?
2、fragment中的页面没有销毁?

首先很快速的排除了数据源是一样的问题,因为每个控件来源的数据值都是不一样的。
再看看fragment的生命周期,是否是页面没有销毁,下面是打印日志。

 D/SIPFragment:  onCreate
 D/SIPFragment:  onCreateView 
 D/SIPFragment:  onDestroyView
 D/SIPFragment:  onDestroy

从日志中可以明显看到页面是销毁了,那下次进来页面应该是重新创建的啊,怎么会值是一样的呢?

二、问题再次查找
因为同事的fragment创建的时候使用是单例?我隐隐觉得和这个有点关系,遂把fragment每次创建的时候都new出新的对象,果然,再次进入页面,就是正常的现象了。
但是新的问题又出现了,同事反馈说,之前他也用过fragment单例,也没有出现过这个问题啊,这个就有点奇怪了,我的注意点又来到了自定义的控件上,因为里面的每个item是frameLatout控件封装,里面包含了EditText。
我顺着这个思路,去掉封装的控件,改用在xml中定义每个需要保存数据的EditText,重新运行程序,结果果然如预期的一样,是正常的,不是出问题的现象。
好了,到这里先简单理一下思路:
Q1、fragment单例会引起这个现象,但不能说单例一定会造成这个问题,单例是如何造成这个bug的呢?其中的机制是什么?
Q2、自己封装的控件,也会引起这个问题,这个又是怎么回事呢,虽然是自定义的控件,但是每个控件的对象和EditText的对象都是不一样的。

但与此同时,又提出了两个问题:
Q3、为什么是修改页面上最后一个控件的值,被保存下来了,换句话说,为什么每个控件相同的值是上一次页面最后一个控件的值?
Q4、为什么每个控件左边的TextView可以做到不相同,而EditText确是一样的呢?

我决定还是一如既往的从源码入手,毕竟我知道一切答案都可以从源码中找到。
既然单例会导致bug,那单例肯定出了问题,单例,顾名思义,是反反复复进入,对象还是同一个,我以经验判断,必定是对象里面的一些状态,标志位等数据没有恢复初始化状态,遂去源码中这个具体的地方查找。

    /**
     * Called by the 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值