那些年,那些坑 之 “Fragment”
2017-03-07 22:12
239 查看
最近写一个Demo的时候用到了Fragment+ViewPager,所以发现了一些坑。
记录下来,给遇到同样问题的人做个参考,也为了避免以后遇到同样的坑。
- Fragment中的数据加载
因为ViewPager的运行机制,它会预加载当前页面的前后的两个页面,当移动到当前页面后的第三个页面,而会销毁那个页面,而如果我们在Fragment中有很多的耗时操作,比如网络请求,就会造成一些用户出现数据加载延迟和页面卡顿的情况,用户体验非常不好。所以为了避免预加载的情况发生,我们就需要用到Fragment的懒加载,看代码:
![](https://img-blog.csdn.net/20170307213933219?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjY1MjU3MTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
重写Fragment的setUserVisibleHint()方法,因为我们通过打印日志发现,这个方法会在onCreat()和onCreatView()之前调用,而且这个方法中的变量isVisibleToUser就正好反应的是页面是否呈现给用户,当某页面是当前页面的相邻页面,这个方法也会调用,不过isVisibleToUser是false,所以我们可以在这个方法中,根据isVisibleToUser的值判断是否开始执行耗时操作。
另外为了避免重复加载数据,即当Fragment被销毁之后又显示给用户的时候,重复加载数据,如果这时候有网络请求,就会重复浪费用户的流量,是很不友好的,说再多不如看代码:
这里的isGotData是是否已经加载过数据的标志,isInitView是是否已经初始化过视图的标志,两个结合避免初始化数据的操作在第一个if判断里面,试图被销毁后就不会再次加载的尴尬!还要记住在onDestroyView中将标志位重置一下,标志此时视图已经被销毁,需要重新加载。不要在onDestroy中重置!X 3,重要的事说三遍,因为这里ViewPager销毁Fragment调用的是onDestroyView,而不是onDestroy。
setUserVisibleHint中获取上下文Context为空
因为是Fragment里面,我们常会用getActivity()、getContext()来获取context,但是,因为这个方法是在onCreate()和onCreateView()之前调用的,所以这个时候获取上下文肯定是为空的,只有等后两个方法调用之后才能获取到上下文,可以加入标志位,在这之后才去获取上下文,也可以避免在这里面获取上下文。
暂时遇到这么多,以后继续分享开发过程中遇到的坑,让自学的我们少走些弯路。
因为个人水平有限,如果以上有什么错误的地方,欢迎大家批评指正!
记录下来,给遇到同样问题的人做个参考,也为了避免以后遇到同样的坑。
- Fragment中的数据加载
因为ViewPager的运行机制,它会预加载当前页面的前后的两个页面,当移动到当前页面后的第三个页面,而会销毁那个页面,而如果我们在Fragment中有很多的耗时操作,比如网络请求,就会造成一些用户出现数据加载延迟和页面卡顿的情况,用户体验非常不好。所以为了避免预加载的情况发生,我们就需要用到Fragment的懒加载,看代码:
@Override public void setUserVisibleHint(boolean isVisibleToUser) { Log.d(TAG, "setUserVisibleHint: "); if (isVisibleToUser) { // 如果页面呈现在用户面前 //这里执行耗时操作 } }
重写Fragment的setUserVisibleHint()方法,因为我们通过打印日志发现,这个方法会在onCreat()和onCreatView()之前调用,而且这个方法中的变量isVisibleToUser就正好反应的是页面是否呈现给用户,当某页面是当前页面的相邻页面,这个方法也会调用,不过isVisibleToUser是false,所以我们可以在这个方法中,根据isVisibleToUser的值判断是否开始执行耗时操作。
另外为了避免重复加载数据,即当Fragment被销毁之后又显示给用户的时候,重复加载数据,如果这时候有网络请求,就会重复浪费用户的流量,是很不友好的,说再多不如看代码:
@Override public void setUserVisibleHint(boolean isVisibleToUser) { Log.d(TAG, "setUserVisibleHint: "); if (isVisibleToUser && !isGotData) { getImageurl(); // 这里面有初始化试图的操作initView() isGotData = true; }else if(!isInitView && isVisibleToUser) { initView(); } }
@Override public void onDestroyView() { super.onDestroyView(); isInitView = false; }
这里的isGotData是是否已经加载过数据的标志,isInitView是是否已经初始化过视图的标志,两个结合避免初始化数据的操作在第一个if判断里面,试图被销毁后就不会再次加载的尴尬!还要记住在onDestroyView中将标志位重置一下,标志此时视图已经被销毁,需要重新加载。不要在onDestroy中重置!X 3,重要的事说三遍,因为这里ViewPager销毁Fragment调用的是onDestroyView,而不是onDestroy。
setUserVisibleHint中获取上下文Context为空
因为是Fragment里面,我们常会用getActivity()、getContext()来获取context,但是,因为这个方法是在onCreate()和onCreateView()之前调用的,所以这个时候获取上下文肯定是为空的,只有等后两个方法调用之后才能获取到上下文,可以加入标志位,在这之后才去获取上下文,也可以避免在这里面获取上下文。
暂时遇到这么多,以后继续分享开发过程中遇到的坑,让自学的我们少走些弯路。
因为个人水平有限,如果以上有什么错误的地方,欢迎大家批评指正!
相关文章推荐
- Fragment 踩过的那些坑
- 【转载】Fragment 全解析(1):那些年踩过的坑
- 盘点我用过的那些网盘(那些年,我们一起玩的网盘)
- Fragment,Activity生命周期、交互、通信和Annotations的那些的常见的坑
- 那些年,我们一起用SkyDrive解的那些“急”
- Fragment全解析系列(一):那些年踩过的坑
- Code Fragment-删掉那些认为有用而注释掉的code。
- 梦想的启航,那些年,那些书
- 那些年,mac pro升级lion的那些事
- 那些年,我们常见的那些人
- Fragment全解析系列:那些年踩过的坑以及解决方案
- Fragment全解析系列(一):那些年踩过的坑
- [心灵鸡汤]那些年那些文字,总有一句戳中泪点
- 梦想的启航,那些年,那些书
- Fragment全解析系列(一):那些年踩过的坑
- Fragment全解析系列(一):那些年踩过的坑
- 关于Fragment使用的那些坑,给出一个完美的填坑方式!源码相送
- Fragment全解析系列:那些年踩过的坑以及解决方案
- Android实战技巧:Fragment的那些坑
- Fragment嵌套Fragment时遇到的那些坑