您的位置:首页 > 其它

Fragment的setUserVisibleHint方法实现懒加载

2016-07-16 16:37 204 查看
我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在这个activity刚创建的时候就变成需要初始化大量资源。这样的结果,我们当然不会满意。那么,能不能做到当切换到这个fragment的时候,它才去初始化呢?该方法用于告诉系统,这个Fragment的UI是否是可见的。所以我们只需要继承Fragment并重写该方法,即可实现在fragment可见时才进行数据加载操作,即Fragment的懒加载。代码如下:在LazyFragment,我增加了三个方法,一个是onVisiable,即fragment被设置为可见时调用,一个是onInvisible,即fragment被设置为不可见时调用。另外再写了一个lazyLoad的抽象方法,该方法在onVisible里面调用。你可能会想,为什么不在getUserVisibleHint里面就直接调用呢?我这么写是为了代码的复用。因为在fragment中,我们还需要创建视图(onCreateView()方法),可能还需要在它不可见时就进行其他小量的初始化操作(比如初始化需要通过AIDL调用的远程服务)等。而setUserVisibleHint是在onCreateView之前调用的,那么在视图未初始化的时候,在lazyLoad当中就使用的话,就会有空指针的异常。而把lazyLoad抽离成一个方法,那么它的子类就可以这样做:在上面的类当中,我们增加了一个标志位isPrepared,用于标志是否初始化完成。然后在我们所需要的初始化操作完成之后调用,如上面的例子当中,在初始化view之后,设置 isPrepared为true,同时调用lazyLoad()方法。而在lazyLoad()当中,判断isPrepared和isVisible只要有一个不为true就不往下执行。也就是仅当初始化完成,并且可见的时候才继续加载,这样的避免了未初始化完成就使用而带来的问题。在这里我对fragment的懒加载实现的介绍就到此为止,如果你有兴趣,可以基于此再深入探究,比如写一个带有缓初始化和可见时刷新的特性的Fragment。另一个例子
用法非常简单,直接在Fragment类中重写上述方法即可。

当isVisibleToUser=true的时候,执行相应的操作,例如:开辟线程和后台服务器进行交互获取数据,进行界面数据加载显示等,或者进行数据统计,统计当前Fragment打开过几次等等。

当isVisibleToUser= false的时候,说明当前Fragment不可见,大家可以根据需求执行响应的操作。
大家应该用过网易新闻客户端,没有使用的可以下载下来看看客户端的界面,它里面就是通过该方法进行判断的,滑动界面切换Fragment,不可见的Fragment数据不加载,切换到可见的时候,在进行加载数据进行显示。另外值得一提的是,网易新闻客户端使用到了缓存,其实缓存很简单的。
简单原理:当前Fragment可见的时候,即isVisibleToUser=true的时候,开启线程从服务器获取数据,获取到之后保存数据在本地缓存文件中,然后加载数据进行界面显示。当Fragment不可见的时候,数据不进行清理,以便于用户切换回该Fragment之后从缓存文件中直接加载数据即可。只有当用户下拉刷新的时候重新从服务器获取数据然后覆盖以前保存的缓存文件,然后加载数据进而显示界面。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: