fragment卡顿 的处理


FragmentManager fragmentManager=getSupportFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.add(ViewId,fragment);// 或者fragmentTransaction.replace(ViewId,fragment);
fragmentTransaction.commit();


基础更好一点的同学会用show和hide方法
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.hide(new FirstFragment()).show(new SecondFragment())

fragment 每次在add/replace或者show/hide都会 new 一个新的实例,这就是致命原因!!!!!

滑动卡顿主要的原因是因为每次切换viewpager的时候,会去缓存设定的页面个数,导致每次都会有fragment里的生命周期被重新调用,一些初始化内容,网络请求等被无限调用。

解决步骤分为两步:

1、首先将viewpager的缓存个数设置为fragment的个数,也就是页面的个数。

例如:viewPager.setOffscreenPageLimit(7);这样可以在第一次创建viewpager和fragment的时候就将所有的页面都缓存,再次切换页面的时候就不会在去缓存已经被缓存的fragment页面。

2、给Fragment写懒加载,只有当前Fragment处于可视窗口的时候会被调用。

重写Fragment的setUserVisibleHint方法,adapter中的每个fragment切换的时候都会被调用,如果是切换到当前页,那么isVisibleToUser==true,否则为false。

3.动态加载模式:

//首先需要先实例好n个全局Fragment

//private  Fragment  currentFragment=new Fragment();(全局)

 
private  FragmentTransaction switchFragment(Fragment targetFragment) {
        FragmentTransaction transaction =getSupportFragmentManager().beginTransaction();
        //第一次使用switchFragment()时currentFragment null,所以要判断一下
        if (!targetFragment.isAdded()) {
            if (currentFragment != null) {
                transaction.hide(currentFragment);
            }
            transaction.add(R.id.fragment,targetFragment,targetFragment.getClass().getName());
        } else {
            transaction.hide(currentFragment).show(targetFragment);
        }
        currentFragment = targetFragment;
        return transaction;   
    }
在点击切换Fragment时:

 
@Override
public void onTabSelected(@IdRes int tabId) {
 
        if (tabId == R.id.tab_one){
 
            switchFragment(first).commit();
 
        }
        if (tabId == R.id.tab_two){
            switchFragment(second).commit();
        }
        if (tabId == R.id.tab_three){
            switchFragment(third).commit();
        }
}

只实例一次,那我的Fragment里的数据要更新怎么办?我的回答是——软件关了再次重启!

好在官方提供了onHiddenChanged方法,每次切换hide或者show时该方法会被执行,可以在这里面更新数据!

//此方法在Fragment中

@Override public void onHiddenChanged(boolean hidden) {    
super.onHiddenChanged(hidden);    
if (hidden){
    //Fragment隐藏时调用    
}else {     
    //Fragment显示时调用   
}
}

此方法是不是比每次add或replace更新数据执行一大坨的生命周期要优雅的多的多!

猜你喜欢

转载自blog.csdn.net/xiaowang_lj/article/details/129041741
今日推荐