前言
以前写过一篇[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()+" 需要加载数据");
}
加入如下代码,然后我们进行以下操作
- 打开主Activity,首次调用
onResume
- 切换tab触发
onHiddenChanged
- 在切回来触发
onHiddenChanged
- 打开其他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方法吗!