前言:之前项目中也会遇到一些头疼的问题或者难解的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