我们的Android开发,目前都是提倡写Fragment。
QA在测试过程中,发现了一些Fragment相关的Bug,尤其是在Kindle Fire上的特殊Bug,其中一个是:
在Kindle Fire上,同一Fragment多次Replace后会出现空白界面。
下面是我的同事的分析:
kindle fire ROM在底层进行了一些修改,这导致了Fragment不能多次replace。Kindle 所希望的是当replace方法被调用的时候,被replace的Fragment一定是一个新的对象,而这和Google在官方文档中所提倡的也是一样的。但不同的是,googles虽然提倡这么做,但它并没有限制说不可以这样用。这时候我们采取了一种方式,但这种方法也有一定的局限性。简单介绍一下这种方法。简单来讲这种方法使用于某些具有Tab的界面。这些页面都存在一个ActionTab,我们在其回调方法(onTabSelected(Tab arg0, FragmentTransaction ft))内通过attach()来绑定一个已经add了的Fragment,同时在onTabUnselected(Tab arg0, FragmentTransaction ft)方法内进行detach()来解绑一个Fragment.这样做不但减少内存的消耗还提高了效率,建议以后遇到类似的情况可以使用这样的方式。但同时这个方法存在一定的局限性。通常我们在类似于Tab这样的控件中比较好使用,而在多个互相影响的Fragment之间就不推荐使用了。
如上面的分析,我们后来碰到一个Bug,由于界面不是Tab的,就暂时没有办法了。
后来,我有了点时间,就参与到这个问题的调查上。我的入手点是在一个问题:Kindle Fire的Android版本到底跟一般的有什么区别?Amazon的官方文档上会有提到相关的已知问题和解决方法吗?
经过查询,并没有在Amazon的网站上找到Kindle Fire有特殊实现的言语,然后根据这个网址的内容(http://en.wikipedia.org/wiki/Kindle_Fire_HD),似乎Kindle Fire的OS只是基于Android的特定版本做了一些修改,没有太底层的改动。然后我又确认了,目前手头的7寸和8.9寸都是第一代的,即基于4.0.3,于是我猜想,是不是4.0.3本身的Bug?手头没有4.0.3的设备,用模拟器重现了Bug。
目前我们只是比较倾向于这个是4.0.3的Bug,还没有找出解决办法,由于4.0.3的较少了,所以我们降低了解决这个问题的优先级。
后来我跟同事讨论了这个事情,建议他们将来接到QA报告的Kindle Fire特有的Bug时,用4.0.3的模拟器尝试重现下。如果是4.0.3特有的Bug,我们可以考虑下优先级,即使真的要Fix,我们在网上搜索答案的时候也可以更广泛,而不用拘泥于Kindle Fire。