好久没写文章了,最近在做新的项目,就拖在现在整个项目差不多在维护阶段了,所以最近时间比较闲。现在我在项目中遇到的一些问题总结一下。可能我们的项目中会有Fragment+viewpager这种组合,但是一个Activity加载几个fragment进行切换时,会出现一种预加载的情况,也就是说一进这个activity界面就会同时加载几个fragment的数据,如果是这样我们就会浪费一些流量资源,显然是不好的。所以我找到了解决的方法,几行代码就能实现这种单个加载数据。这种原理主要是用的fragment里的setUserVisibleHint方法,隐藏或者展示。看一下它的源码:
/**
* Set a hint to the system about whether this fragment's UI is currently visible
* to the user. This hint defaults to true and is persistent across fragment instance
* state save and restore.
*
* <p>An app may set this to false to indicate that the fragment's UI is
* scrolled out of visibility or is otherwise not directly visible to the user.
* This may be used by the system to prioritize operations such as fragment lifecycle updates
* or loader ordering behavior.</p>
*
* @param isVisibleToUser true if this fragment's UI is currently visible to the user (default),
* false if it is not.
*/
public void setUserVisibleHint(boolean isVisibleToUser) {
if (!mUserVisibleHint && isVisibleToUser && mState < STARTED
&& mFragmentManager != null && isAdded()) {
mFragmentManager.performPendingDeferredStart(this);
}
mUserVisibleHint = isVisibleToUser;
mDeferStart = mState < STARTED && !isVisibleToUser;
}
好了我们先定义一个父BaseFragment,在这里面我们定义一些方法,
protected boolean isVisible;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(getUserVisibleHint()) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInvisible();
}
}
protected void onVisible(){
lazyLoad();
}
protected void lazyLoad(){};
protected void onInvisible(){};
然后我们在子fragment里定义一个全局变量private booleanisPrepared;在Fragment中的onCreateView方法中加入isPrepared=true;lazyLoad();
再重写lazyLoad()方法,
@Override
protected void lazyLoad() {
if(!isPrepared || !isVisible) {
return;
}
data();
}
这里的data()方法是我定义的一个方法,里面主要是放的请求数据的方法。这样就能取消这种预加载。
下载代码