Fragment与ViewPager结合使用白屏问题

最近的一个项目使用了fragment与viewpager结合的方式来展示内容,其中又包含网络请求与数据的列表展示。

Fragment与ViewPager的结合使用出现白屏问题,网上的答案很多,基本上能够都覆盖到。但是我遇见的这个问题,却很奇葩,尝试了所有方案都没有解决。最终在一行一行添加log观察打印结果时才注意到问题所在。所以写一篇文章来给大家提供个思路,也许会有开发者有着与我类似的操作。

我的这个白屏问题出现的情况是第一次加载几个tab页面之间的切换都正常,但是当切换后重新再次加载页面时,就出现了白屏现象,而且还是必现。在增加Log并观察打印结果后,终于发现。

一、如果你的网络请求结果会刷新UI,或者操作控件的展示之类,请务必查看程序的执行顺序。

ViewPager有个机制是预加载,当现实第一个页面时,实际上已经在准备第二个页面了。如果你的网络请求等操作都是一气呵成,那么第二个页面还未显示,但是已经开始执行一些流程了,展示第一个页面的时候,第二个页面的数据已经返回并执行了后续操作。如果你的UI操作是基于页面展示才执行的话,那么第二个页面的UI操作很有可能无法正常执行。

二、小心Fragment的生命周期

使用ViewPager展示fragment的时候,尤其要注意它的生命周期,因为有一种FragmentStatePagerAdapter是可以保存fragment的,这时候重新加载fragment可能会省略一些初始化步骤,如果你的程序有一些必要操作是跟初始化有关的话,那么也一定要注意,很有可能这些步骤未得到执行。以本人为例,我最初的网络请求是放到初始化程序后面顺序执行的。但是当重新加载fragment的时候,打印log发现fragment的一些方法被省略了,以至于在没有初始化我布局里的展示列表控件的时候,网络请求已经返回,但是找不到控件,数据无处展示。所以白屏。

三、解决方案

严格检查自己程序的执行逻辑与顺序,找出其中的依赖关系,确保每一步执行时,其依赖是可靠的。本人最终的处理方式是增加逻辑判断,在fragment的onResume方法中开始请求网络,此时布局是加载完成的,数据返回后不会找不到控件而无法展示,问题也得到了解决。如果不是我这种原因引起的白屏,我想大多数原因应该属于网上提供的常见问题类型,这里就不一一赘述了。大家可以去搜一些关键词如FragmentStatePagerAdapter,重写destroyItem方法,使用childFragmentManager等等。

扫描二维码关注公众号,回复: 2494623 查看本文章

猜你喜欢

转载自blog.csdn.net/Kongou/article/details/81302610