Android在切换Fragment过程中,如何避免重新加载

这是公司的新项目,MainActivity中是集合了多个Fragment,同时,Fragment 中又用ViewPager 嵌套了多个Fragment

所以在MainActivity中,为了避免滑动冲突,通过FragManager 进行Fragment 的切换操作

但是,同时也产生了一个问题。这里先卖个关子,我们先看下Frament的生命周期图

这是一张很常见的周期图,选自网络。

现在,我把相关的日志打印出来。



接着,我试图切换下Fragment ,同样,打印出相对应的日志


可以看出,在第二个Fragment Create之后,第一个Fragment 就根据生命周期的流程被销毁了

最后,我们再切回第一个Fragment


所执行的顺序和第一个Fragment 切换到第二个Fragment 的流程是一样的。

于是问题就来了,如果我们Fragment 中可能包含需要异步加载或者调用缓存等操作的时候。

需要按照生命周期重新进行Fragment 进行加载,这无论是对于时间还是流量开销都是比较大的。

现在,我们就来解决这个问题。

------------------------------------------------------------------------------------------------------------------------华丽的分割线------------------------------------------------------------------------------------------

解决方案: 在Activity 中添加该方法

//声明一个Fragment
 private Fragment mFrag;
//创建用于存放Fragment的集合
<span style="color:#000080;">private List<Fragment> frags = new ArrayList<>();</span>
//进行Fragment 加载的方法,position 是Activity 中选中Fragment在Tab中的序号
 private void loadFragment(int position) {

//从集合中获取相对序号的Fragment 
       Fragment f = frags.get(position);
        fragmentTransaction = fragmentManager.beginTransaction();
//首先判断mFrag 是否为空,如果不为,先隐藏起来,接着判断从List 获取的Fragment是否已经添加到Transaction中,如果未添加,添加后显示,如果已经添加,直接显示
 if(mFrag != null) {
            fragmentTransaction.hide(mFrag);
        }
        if(!f.isAdded()) {
            fragmentTransaction.add(R.id.flMain, f);

        } else {
            fragmentTransaction.show(f);
        }
//将获取的Fragment 赋值给声明的Fragment 中,提交
 mFrag = f;
        fragmentTransaction.commit();

    }

调用该方法后,重新运行程序,同样的,打印日志,查看结果

跳转到第一个Fragment 时打印出的日志


接着,跳转到第二个Fragment


忽略那条JSON数据,可以看出,创建第二个Fragment 时只是按生命周期创建了第二个Fragment ,然而第一个Fragment 并没有被销毁

为了证明该方法确实有用,我们把Fragment 再切换回第一个Fragment

很好,Logcat并未显示有关Fragment 声明周期的日志,这说明在切换到一个已创建的Fragment 后,不再重新启动一个相关的生命周期,这节约了加载的时间和流量


ps:可以把该方法写入到基类中,封装后可重复使用,没必要重复造轮子。



没有更多推荐了,返回首页