使用VIewPager+Fragment实现天气软件切换城市功能所遇到的问题
问题描述:完成了多个城市的选择之后,在切换城市的过程中出现了一些问题,程序会因为切换城市而崩溃!
先了解一下Fragment 和ViewPager的预加载方式。
文章图片
假设MainActivity中有以上三个碎片所动态加载所构成。那么加载机制为,首先展示的是碎片1,那么系统会先预加载碎片2,而3不会被加载,当我滑动到碎片2时,碎片3会被加载,同时1还没有被销毁,返回1将不会产生错误,但是如果我从2滑动到了3,这时碎片1已经被销毁,当我返回碎片2时由于不知道什么原因,碎片1不能重新被加载,所以就产生错误,发生了程序的崩溃。
下面使用程序中的Log来验证这个猜想!!
文章图片
这里我打开了程序,每一个页面都会去请求三样指标:
1.天气预报数据
2.实况天气
3.生活指数
…其实还有别的指标,只不过我在这个DEMO当中没有都写出来。我们可以看到前两个碎片的内容都被加载了。
当我滑动界面,切换到第二个碎片:
文章图片
可以看到这里第三个城市也被加载出来了。而这时我在第二个碎片,现在往回滑动没有出错,但是切换到第一个城市,理论上第三个碎片的数据应该会被销毁,所以再滑动到第二个碎片会程序Crash。经过验证果然崩溃了,看来程序崩溃就是因为我的碎片被销毁了,当我要使用的时候不能再次加载。所以解决办法就是让碎片一直存在,而不允许销毁,或者想办法重新加载碎片。这里重新加载碎片会花费更多的资源,所以我选择不让碎片销毁。
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
//如果注释这行,那么不管怎么切换,page都不会被销毁
//super.destroyItem(container, position, object);
}
【使用VIewPager+Fragment实现天气软件切换城市功能所遇到的问题】在Adapter中,重写destroyItem()方法,使之不能销毁。程序崩溃的问题就解决了!
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Node.js中readline模块实现终端输入