我们在做应用开发的时候,一个活动里面可能会以:viewpage(或其他容器)与多个片段来组合使用。而:viewpage默认会缓存三页数据,即::viewpage每加载一个片段,都会预先加载此片段左侧或右侧的片段。而如果每个片段都需要去加载数据,或从本地加载,或从网络加载,那么在这个活动刚创建的时候就变成需要初始化大量资源,浪费用户流量不止,还造成卡顿,这样的结果,我们当然不会满意。那么,能不能做到当切换到这个片段的时候,它才去初始化呢?答案就在片段里的setUserVisibleHint这个方法里。
该方法用于告诉系统,这个片段的UI是否是可见的,所以我们只需要继承片段并重写该方法,即可实现在片段可见时才进行数据加载操作,即片段的懒加载。
代码如下:
包com.yctime.truelove.fragment; 进口android.content.Context; 进口android.nfc.Tag; 进口android.os.Bundle; 进口android.support.annotation.Nullable; 进口android.support.v4.app.Fragment; 进口android.util.Log; 进口android.view.LayoutInflater; 进口android.view.View; 进口android.view.ViewGroup;/* * *基类片段 */公共抽象类BaseFragment延伸片段{ 受保护的视图mRootView; 公共环境mContext; 布尔isVisible保护; 私人布尔isPrepared; 私人布尔isFirst=true; 公共BaseFragment () {//需要空的公共构造函数 } @Override 公共空间setUserVisibleHint(布尔isVisibleToUser) { super.setUserVisibleHint (isVisibleToUser);//日志。d(“标签”、“片段→setUserVisibleHint”); 如果(getUserVisibleHint ()) { isVisible=true; lazyLoad (); 其他}{ isVisible=false;> 保护无效lazyLoad () { 如果(!isPrepared | | ! isVisible | | ! isFirst) { 返回: } 日志。d(“标签”,getClass () . getname () +”→initData () "); initData (); isFirst=false; }
这里我们做了三个判断,判断isPrepared和isVisible和isFirst只有全为真,才去执行initData()方法加载网络(或本地)数据。
①isPrepared参数在系统调用onActivityCreated时设置为真,这时onCreateView方法已调用完毕(一般我们在这方法里执行findviewbyid等方法),确保initData()方法不会报空指针异常。
②isVisible参数在片段可见时通过系统回调setUserVisibileHint方法设置为真,不可见时为假,这是片段实现懒加载的关键。
③isFirst确保:viewpage来回切换时BaseFragment的initData方法不会被重复调用,initData在该分段的整个生命周期只调用一次,第一次调用initData()方法后马上执行isFirst=false。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。