在大部分安卓APP开发中都会用到ViewPager和Fragment的结合使用,而ViewPager又会出现预加载的情况,比如说打开app时第一个fragment和第二个fragment已经加载好了,当滑动到第二个fragment的时候第三个fragment已经加载好了,我们大多时候都希望当滑动到哪一页就加载哪一页,这样性能比较好也比较省流量,因此需要一个方法来解决这个问题。
BaseFragment中
import android.support.v4.app.Fragment;
/**
* Created by AZ001 on 2017/7/6.
*/
public class BaseFragment extends Fragment {
protected boolean mIsVisible = false;
/**
* 在这里实现懒加载.
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()) {
mIsVisible = true;
onVisible();
} else {
mIsVisible = false;
onInvisible();
}
}
protected void onInvisible() {
}
/**
* 显示时加载数据,需要这样的使用
* 注意声明 isPrepared,先初始化
* 生命周期会先执行 setUserVisibleHint 再执行onActivityCreated
* 在 onActivityCreated 之后第一次显示加载数据,只加载一次
*/
protected void loadData() {
}
protected void onVisible() {
loadData();
}
}
在setUserVisibleHint中判断当前界面是否展示在用户面前,如果是那么执行onVisible()方法,否则执行onInvisible()方法
FirstPageFragment
import android.os.Bundle;
import android.support.annotation.Nullable;
/**
* Created by AZ001 on 2017/7/6.
*/
public class FirstPageFragment extends BaseFragment {
private boolean isPrepared = false;
private boolean isFirst = true;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isPrepared = true;
//loadData的执行比onActivityCreated快,所以要保证onActivityCreated执行过,再去执行loadData方法,初始化完成后才能执行loadData方法
//比如当打开有4个fragment的界面的时候,第一个fragment执行了loadData方法但是还没有初始化,所以不能执行isParepared为false,
//然后第一个界面和第二个界面的onActivityCreated已经先执行了,(这里setOffscreenPageLimit方法设置的数量为默认的)此时isPrepared为true。
//然后需要手动的去执行loadData方法(因为loadData已经执行了一次之前)。当切换到第二个界面的时候,由于onActivityCreated已经执行过了,初始化已经做好了,那么
//BaseFragment 中的onVisible方法会执行,随后子Fragment中的loadData方法执行了,就不会出现第一个界面打开时的情况
loadData();
}
@Override
protected void loadData() {
//只有当fragment显示了 初始化完成了 第一次进入界面的时候才能进行数据请求
if (!mIsVisible || !isPrepared || !isFirst) {
return;
}
//其他操作
}
}
SecondPageFragment
import android.os.Bundle;
import android.support.annotation.Nullable;
/**
* Created by AZ001 on 2017/7/6.
*/
public class SecondPageFragment extends BaseFragment {
private boolean isPrepared = false;
private boolean isFirst = true;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isPrepared = true;
//viewpager的预加载会先执行此方法
}
@Override
protected void loadData() {
//只有当fragment显示了 初始化完成了 第一次进入界面的时候才能进行数据请求
if (!mIsVisible || !isPrepared || !isFirst) {
return;
}
//其他操作
}
}
在loadData方法中去请求数据,同时要判断是否展示当前界面,是否已经初始化了,是否已经执行过请求不用每次显示界面都去请求数据。