Anddroid使用Fragment的setUserVisibleHint方法实现延时加载
2016-03-14 14:01
435 查看
大家开发Android的APP的时候,应该都是用过Fragment。
Fragment使用起来非常方便,灵活。在ViewPage中PageAdapter来管理所有的Fragment即可。
但是大家都会遇到一个问题,就是在加载一个Fragment的时候,会自动缓存左右几个(默认是一个)页面,此时也会调用到正常的生命周期函数,onCreate,onCrateView,onResume.可是这样给用户的体验很不好。因为用户还没有看到要预加载的界面,却已经开始加载,用户或许可能就不会看到那个界面,但是紧邻的那个界面却已经开始加载了。
例如:一个ViewPager中存在三个Fragment页面的时候,当默认是第一个页面可见,并加载数据进而显示界面。那么在后台就会收集到紧邻的那个Fragment的信息数据了。
如何处理呢?其实很简单,Fragment下专门有一个setUserVisibleHint函数来处理这个事情:
view
sourceprint?
用法非常简单,直接在Fragment类中重写上述方法即可。
当isVisibleToUser=true的时候,执行相应的操作,例如:开辟线程和后台服务器进行交互获取数据,进行界面数据加载显示等,或者进行数据统计,统计当前Fragment打开过几次等等。
当isVisibleToUser= false的时候,说明当前Fragment不可见,大家可以根据需求执行响应的操作。
大家应该用过网易新闻客户端,没有使用的可以下载下来看看客户端的界面,它里面就是通过该方法进行判断的,滑动界面切换Fragment,不可见的Fragment数据不加载,切换到可见的时候,在进行加载数据进行显示。另外值得一提的是,网易新闻客户端使用到了缓存,其实缓存很简单的。
简单原理:当前Fragment可见的时候,即isVisibleToUser=true的时候,开启线程从服务器获取数据,获取到之后保存数据在本地缓存文件中,然后加载数据进行界面显示。当Fragment不可见的时候,数据不进行清理,以便于用户切换回该Fragment之后从缓存文件中直接加载数据即可。只有当用户下拉刷新的时候重新从服务器获取数据然后覆盖以前保存的缓存文件,然后加载数据进而显示界面。
不难,我也不单独給实例什么的了。大家如果用到的时候不怎么会用的话,欢迎和我交流交流,说不上一定帮上忙,但是我一定尽力,共同进步!!^_^【握手】
在重复一句,上面的方法超级简单、实用!!!
1、Service的onStartCommand方法的疑问
2、AndroidGUI29:用getDrawingCache方法获取ImageView中的图像需要注意的问题
3、android实用测试方法之Monkey与MonkeyRunner
4、深入研究Android(2)--好吧,我是一个main方法
5、JNI回调静态方法与非静态方法的区别
6、Android调用父类方法,进行子界面刷新
7、Android上用模板方法模式实现具有自动重用View功能的Adapter
8、GreenDroid的getAction方法冲突问题
Fragment使用起来非常方便,灵活。在ViewPage中PageAdapter来管理所有的Fragment即可。
但是大家都会遇到一个问题,就是在加载一个Fragment的时候,会自动缓存左右几个(默认是一个)页面,此时也会调用到正常的生命周期函数,onCreate,onCrateView,onResume.可是这样给用户的体验很不好。因为用户还没有看到要预加载的界面,却已经开始加载,用户或许可能就不会看到那个界面,但是紧邻的那个界面却已经开始加载了。
例如:一个ViewPager中存在三个Fragment页面的时候,当默认是第一个页面可见,并加载数据进而显示界面。那么在后台就会收集到紧邻的那个Fragment的信息数据了。
如何处理呢?其实很简单,Fragment下专门有一个setUserVisibleHint函数来处理这个事情:
view
sourceprint?
01.
<code
class
=
" hljs java"
>
//实现该方法即可实现可见再加载。不可见不加载的效果!!!
02.
@Override
03.
public
void
setUserVisibleHint(
boolean
isVisibleToUser) {
04.
super
.setUserVisibleHint(isVisibleToUser);
05.
if
(isVisibleToUser) {
06.
//可见时执行的操作
07.
}
else
{
08.
//不可见时执行的操作
09.
}
10.
}</code>
用法非常简单,直接在Fragment类中重写上述方法即可。
当isVisibleToUser=true的时候,执行相应的操作,例如:开辟线程和后台服务器进行交互获取数据,进行界面数据加载显示等,或者进行数据统计,统计当前Fragment打开过几次等等。
当isVisibleToUser= false的时候,说明当前Fragment不可见,大家可以根据需求执行响应的操作。
大家应该用过网易新闻客户端,没有使用的可以下载下来看看客户端的界面,它里面就是通过该方法进行判断的,滑动界面切换Fragment,不可见的Fragment数据不加载,切换到可见的时候,在进行加载数据进行显示。另外值得一提的是,网易新闻客户端使用到了缓存,其实缓存很简单的。
简单原理:当前Fragment可见的时候,即isVisibleToUser=true的时候,开启线程从服务器获取数据,获取到之后保存数据在本地缓存文件中,然后加载数据进行界面显示。当Fragment不可见的时候,数据不进行清理,以便于用户切换回该Fragment之后从缓存文件中直接加载数据即可。只有当用户下拉刷新的时候重新从服务器获取数据然后覆盖以前保存的缓存文件,然后加载数据进而显示界面。
不难,我也不单独給实例什么的了。大家如果用到的时候不怎么会用的话,欢迎和我交流交流,说不上一定帮上忙,但是我一定尽力,共同进步!!^_^【握手】
在重复一句,上面的方法超级简单、实用!!!
延伸阅读:
1、Service的onStartCommand方法的疑问2、AndroidGUI29:用getDrawingCache方法获取ImageView中的图像需要注意的问题
3、android实用测试方法之Monkey与MonkeyRunner
4、深入研究Android(2)--好吧,我是一个main方法
5、JNI回调静态方法与非静态方法的区别
6、Android调用父类方法,进行子界面刷新
7、Android上用模板方法模式实现具有自动重用View功能的Adapter
8、GreenDroid的getAction方法冲突问题
相关文章推荐
- python mysql安装与使用
- 今天突然感觉不写博客真的不行啦。 搞了两年开发, 啥都没留下
- RPG游戏地牢设计的29个要点
- HTML+CSS Day11产品网站
- iOS --appledoc的安装和使用
- 与HTTP有什么区别?HTTPS的七个误解
- House Robber
- Sublime text 2/3 中 Package Control 的安装与使用方法
- virtio,vhost 和vhost-user
- Android抽象布局——include、merge 、ViewStub
- spring配置连接池
- ahjesus Axure RP 7.0注册码
- shell命令-trap
- Cordova + Ionic + AngularJS
- 使用ORM数据库框架greenDao
- Android中include标签的使用及注意事项
- WinCVS提交时出现错误 cvs server: C:/WINDOWS/TEMP/cvs**.tmp: No such file or directory 的解决方案
- CSS选择器
- java解析Xml
- RedMine项目管理系统