在Android应用中,:viewpage是我们不可避免使用的一个控件,因为它可以使我们在占用较少空间的同时,增强内容的丰富性,同时以其内部流淌着谷歌的血液,所以它几乎成了每一个应用的标配控件。但是,假如:viewpage的每一个片段都需要通过网络拉取数据加载,而:viewpage是默认加载前两项的,所以在很容易造成网络丢包或者网络堵塞等问题,所以片段使用懒加载是非常有必要的。
举个栗子:
如上图所示,我们有两个大的标签:人物和风景。而人物选项卡下有三个选项卡:美女,帅哥,萌娃三个选项卡,风景选项卡下有:北京,香港,上海三个选项卡。假如当应用刚启动时,执行的生命周期如下:
我们可以看的到,应用程序会默认加载美女和帅哥两个片段,并且它们的生命周期都执行到安吉星()方法,同时加载两个片段,假如我们在片段加载的时候拉取网络数据,那么就会造成如上所说的网络丢包或者网络堵塞等问题,所以我们为了避免这个问题,就需要实现片段的懒加载,当我们对片段可见的时候,再进行网络加载数据。
针对背景讨论的问题,我们最终要实现的目标就是,当片段对我们可见时,我们才进行网络加载,然后再解析数据,更新UI。针对上面的演示,我们需要做到如下效果:
要实现起来其实也并不复杂,在片段中有一个<代码> setUserVisibleHint 代码>这个方法,而且这个方法是优于onCreate()方法的,所以也可以作为片段的一个生命周期来看待,它会通过isVisibleToUser告诉我们当前片段我们是否可见,我们可以在可见的时候再进行网络加载。
公共空间setUserVisibleHint(布尔isVisibleToUser)
当我们在<代码> setUserVisibleHint 代码>方法中进行日志输出时,我们可以看到:
只有可见时,我们isVisibleToUser为真的,否则为假,所以我们可以重写<代码> setUserVisibleHint 代码>方法,然后在可见时进行网络加载数据:
@Override 公共空间setUserVisibleHint(布尔isVisibleToUser) { 日志。d(“标签”,mTagName +”setUserVisibleHint()——比;isVisibleToUser=" + isVisibleToUser); 如果(isVisibleToUser) { pullData (); } super.setUserVisibleHint (isVisibleToUser); }
由第二部分我们可以知道,<代码> setUserVisibleHint(布尔isVisibleToUser) 代码>方法是比<代码> onCreate> 代码更早调用的,但是我们一般在加载数据时,都会在数据加载完成时进行UI更新,所以这就有了一个问题,假如拉取数据是秒回,但是我们还没有进行UI绑定,或者是适配器初始化等,那么我们就无法更新界面了,所以片段给我们提供了另一个方法<代码> getUserVisibleHint()> 代码,它就是用来判断当前片段是否可见,所以我们就可以在一系列变量初始化完成后再判断是否可见,若可见再进行数据拉取:
@Override 公共空间onStart () { super.onStart (); 日志。d(“标签”,mTagName + onStart ()); … 如果(getUserVisibleHint ()) { pullData (); } }
当然,如果你的网络请求并不需要涉及界面更新,那么就可以直接在<代码> setUserVisibleHint(布尔isVisibleToUser) 代码>里操作,所以最终还是要根据各自的实际用途来使用。
最后,附上懒加载的演示:Github/LazyFragment
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。