推荐在BaseFragment里加入
1、定义变量标识
public boolean canExcute = true;//为了onActivityCreated中setUserVisibleHint方法只执行一次
public boolean isFirstExcute = true;//标记页面是否是第一次加载,为了初始化只执行一次
2、在onActivityCreated()方法中加入判断是否第一次加载时执行
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initWeight();
if (canExcute) {//页面第一次加载时执行,以后不在执行
canExcute = false;
setUserVisibleHint(getUserVisibleHint());
}
}
3、重写setUserVisibleHint()方法,fragment的初始化方法initData()不要写在onActivityCreated里而是要写在页面可见 并且是第一次加载的方法里面 ,如果要加入数据刷新则在页面每次对用户可见的方法里面
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (canExcute) {//onActivityCreated方法执行之前,不让此方法执行
LogUtil.getInstance().d("测试优化Fragment=======/onActivityCreated方法执行之前,不让此方法执行");
return;
}
if (isVisibleToUser && isFirstExcute) {// 页面可见并且是第一次加载
isFirstExcute = false;//标记页面已经加载过一次,以后不需要在执行
LogUtil.getInstance().d("测试优化Fragment=======initData");
initData();
baseLloading.setVisibility(View.GONE);//隐藏Lodeing
}
if (getUserVisibleHint()) {// 页面每次对用户可见时执行
LogUtil.getInstance().d("测试优化Fragment=======页面每次对用户可见时执行");
} else {
LogUtil.getInstance().d("测试优化Fragment=======页面没见到呢=======");
}
}
原理
利用fragment中的setUserVisibleHint(boolean isVisibleToUser)方法中传进来的那个isVisibleToUser这个参数, 这个参数的字面意思是表示当前fragment是否对用户可见,当fragment对用户可见的时候才去加载页面,加载数据
再附上我的切换Fragment优化方案
每次切换之前首先要判断是否初始化,如果为空才初始化,然后再次判断是否添加到FragmentTransaction 里,如果添加过,直接show,并隐藏前一个fragment,没添加过则要先添加,这种方案优化了fragment的性能,并解决了每次切换都走一遍生命周期的问题
/**
* 切换Fragment
*/
private FragmentTransaction switchFragment(Fragment targetFragment) {
FragmentTransaction mFragmentTransaction = getSupportFragmentManager().beginTransaction();
if (targetFragment != targetFragmentflag) {
mFragmentTransaction.setCustomAnimations( //为Fragment添加切换动画
R.anim.slide_left_in,
R.anim.slide_right_out,
R.anim.slide_right_in,
R.anim.slide_left_out
);
if (!targetFragment.isAdded()) {
//第一次使用switchFragment()时currentFragment为null,所以要判断一下
if (currentFragment != null) {
mFragmentTransaction.hide(currentFragment);
}
mFragmentTransaction.add(R.id.home_frame, targetFragment, targetFragment.getClass().getName());
} else {
mFragmentTransaction.hide(currentFragment).show(targetFragment);
}
currentFragment = targetFragment;
}
this.targetFragmentflag = targetFragment;
return mFragmentTransaction;
}
使用
if (mHomeFragment == null) {
mHomeFragment = new HomeFragment ();
}
switchFragment(mHomeFragment ).commit();