[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方法吗!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值