安卓性能优化之Fragment中数据的懒加载

1、背景:为什么需要懒加载。

我们在做安卓项目的时候,经常会有一个使用场景:ViewPage与多个Fragment组合使用。

%title插图%num

 

然而,viewpager有着预加载机制:默认一次加载当前页面前后两个页面,即使设置setOffLimit(0)也没有效果。  虽然预加载优化了app的体验效果,但是这样把我们看不到的页面的数据也加载了,大大降低了性能,浪费初始化资源。

这时候,我们就需要懒加载。

 

2、什么是懒加载:懒加载的定义。

当页面可见的时候,才加载当前页面。 没有打开的页面,就不会预加载。

说白了,懒加载就是可见的时候才去请求数据。

 

3、实现方法

(1)关键点

主要的方法是Fragment中的setUserVisibleHint(),此方法会在onCreateView()之前执行,当viewPager中fragment改变可见状态时也会调用,当fragment 从可见到不见,或者从不可见切换到可见,都会调用此方法,使用getUserVisibleHint() 可以返回fragment是否可见状态。

(2)注意事项

<1>添加isPrepared参数。在系统调用onActivityCreated时设置为true,这时onCreateView方法已调用完毕(一般我们在这方法里执行findviewbyid等方法),确保 onLazyLoad()方法不会报空指针异常。

<2>添加isLazyLoaded参数。确保ViewPager来回切换时BaseFragment的initData方法不会被重复调用,onLazyLoad在该Fragment的整个生命周期只调用一次,*次调用onLazyLoad()方法后马上执行 isLazyLoaded = true。

<3>getUserVisibleHint()会返回是否可见状态,这是fragment实现懒加载的关键,只有fragment 可见才会调用onLazyLoad() 加载数据。

 

(3)demo

%title插图%num
懒加载fragment基类

评论:

  • 码哥%title插图%numJaynm:兄弟,你这个还是有bug阿,如果跳页面切换时,还是会自动加载左右2个界面10 月前回复%title插图%num
    • 书中有颜如玉回复:我是这样处理的,这都过五个月了,你这还没处理吗5 月前回复%title插图%num
    • 书中有颜如玉回复:好久不见啊5 月前回复%title插图%num
    • 书中有颜如玉回复:
      1. /** Fragment当前状态是否可见 */
      2. protected boolean isVisible=false;
      3. @Override
      4. public void setUserVisibleHint(boolean isVisibleToUser) {
      5. super.setUserVisibleHint(isVisibleToUser);
      6. if(getUserVisibleHint()) {//可见
      7. isVisible = true;
      8. onVisible();
      9. } else {//不可见
      10. isVisible = false;
      11. onInvisible();
      12. }
      13. }

      5 月前回复%title插图%num

    • 码哥%title插图%numJaynm回复书中有颜如玉:有解决方案5 月前回复%title插图%num
    • 书中有颜如玉回复:和你遇到一样的问题了7 月前回复%title插图%num
    • 书中有颜如玉回复:你这个问题处理了吗7 月前回复