天天看点

[AS3.0.1]关于FragmentTabHost不调用setUserVisibleHint如何实现懒加载前言探究资料

前言

以前写过一篇[AS3.0.1]关于ViewPager、FragmentPagerAdapter、Fragment源码研究文章,上面探究了一些懒加载的实现。但是我后面写了一个[AS2.3.3]底部栏实现 (使用FragmentTabHost+Fragment实现)然后在使用的时候突然发现,调用懒加载的方式并不适用,那么我们就只能用新的方案了!

探究

首先我们能从生命周期中知道,

onResume

可以实现每次打开都调用一次。然后用自带的

isVisible()

方法可以知道哪些Fragment是当前显示的来进行加载数据。

但是这个有一个问题,那就是如果不是单独的切换tab而是打开新的Activity返回也会触发加载的方法。这样会导致多余的加载数据。

之后我找到了一个新的方法

onHiddenChanged(boolean hidden)

源码如下

/**
     * Called when the hidden state (as returned by {@link #isHidden()} of
     * the fragment has changed.  Fragments start out not hidden; this will
     * be called whenever the fragment changes state from that.
     * @param hidden True if the fragment is now hidden, false otherwise.
     */
    public void onHiddenChanged(boolean hidden) {
    }
           

我们可以加入这个来判断首次之后的更新数据

private boolean isLoad = true;

    @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        if (!hidden) {
            load();
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.e("-s-", getClass().getSimpleName()+" onResume");
        if (isVisible() && isLoad) {
            isLoad = false;
            load();
        }
    }

    private void load() {
        Log.e("-s-", getClass().getSimpleName()+" 需要加载数据");
    }
           

加入如下代码,然后我们进行以下操作

  1. 打开主Activity,首次调用

    onResume

  2. 切换tab触发

    onHiddenChanged

  3. 在切回来触发

    onHiddenChanged

  4. 打开其他Activity,在切回来

log如下

E/-s-: HomeFragment onResume
E/-s-: HomeFragment 需要加载数据
E/-s-: TestFragment onResume
E/-s-: TestFragment 需要加载数据
E/-s-: HomeFragment 需要加载数据
E/-s-: HomeFragment onResume
E/-s-: TestFragment onResume
           

这样算是实现了以FragmentPagerAdapter实现的调用setUserVisibleHint实现的懒加载流程了!

资料

您真的懂fragment的onResume,setUserVisibleHint,onHiddenChanged,isVisible方法吗!