使用VIewPager+Fragment实现天气软件切换城市功能所遇到的问题

问题描述:完成了多个城市的选择之后,在切换城市的过程中出现了一些问题,程序会因为切换城市而崩溃!
先了解一下Fragment 和ViewPager的预加载方式。
使用VIewPager+Fragment实现天气软件切换城市功能所遇到的问题
文章图片

假设MainActivity中有以上三个碎片所动态加载所构成。那么加载机制为,首先展示的是碎片1,那么系统会先预加载碎片2,而3不会被加载,当我滑动到碎片2时,碎片3会被加载,同时1还没有被销毁,返回1将不会产生错误,但是如果我从2滑动到了3,这时碎片1已经被销毁,当我返回碎片2时由于不知道什么原因,碎片1不能重新被加载,所以就产生错误,发生了程序的崩溃。
下面使用程序中的Log来验证这个猜想!!
使用VIewPager+Fragment实现天气软件切换城市功能所遇到的问题
文章图片

这里我打开了程序,每一个页面都会去请求三样指标:
1.天气预报数据
2.实况天气
3.生活指数
…其实还有别的指标,只不过我在这个DEMO当中没有都写出来。我们可以看到前两个碎片的内容都被加载了。
当我滑动界面,切换到第二个碎片:
使用VIewPager+Fragment实现天气软件切换城市功能所遇到的问题
文章图片

可以看到这里第三个城市也被加载出来了。而这时我在第二个碎片,现在往回滑动没有出错,但是切换到第一个城市,理论上第三个碎片的数据应该会被销毁,所以再滑动到第二个碎片会程序Crash。经过验证果然崩溃了,看来程序崩溃就是因为我的碎片被销毁了,当我要使用的时候不能再次加载。所以解决办法就是让碎片一直存在,而不允许销毁,或者想办法重新加载碎片。这里重新加载碎片会花费更多的资源,所以我选择不让碎片销毁。

@Override public void destroyItem(ViewGroup container, int position, Object object) { //如果注释这行,那么不管怎么切换,page都不会被销毁 //super.destroyItem(container, position, object); }

【使用VIewPager+Fragment实现天气软件切换城市功能所遇到的问题】在Adapter中,重写destroyItem()方法,使之不能销毁。程序崩溃的问题就解决了!

    推荐阅读