Android优化之切换Fragment

作者: AlicFeng | 来源:发表于2016-05-16 22:32 被阅读4573次

前言:课程设计已经基本完成,但是在点击切换Fragment的时候总是感觉有点卡顿,第一次读取网络服务器数据就体现的特别明显,在本地的话也会稍微有一点卡顿,因为我引用了一个多Fragment的框架,强迫症的我看着就是不舒服,查看框架源码...,果然,框架犯了一个低级的错误:切换Fragment竟然都是用replace()方法来替换Fragment。


****切换Fragment的方法简介****
replace()
该方法只是在上一个Fragment不再需要时采用的简便方法
show() hide() add()
正确的切换方式是add(),切换时hide(),add()另一个Fragment;再次切换时,只需hide()当前,show()另一个


****看源码吧****

//错误的做法
//每次切换的时候,Fragment都会重新实例化,重新加载一边数据,这样非常消耗性能和用户的数据流量
public void switchFragment(Fragment targetFragment) {
    if (targetFragment == null)
      return;
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    //目标Fragment替换原来的Fragment
    transaction.replace(R.id.content, targetFragment);
    transaction.commit();
  }

//正确的做法
private void switchFragment(Fragment targetFragment) {
    FragmentTransaction transaction = getSupportFragmentManager()
            .beginTransaction();
    if (!targetFragment.isAdded()) {
        transaction
                .hide(currentFragment)
                .add(R.id.main_fragment, targetFragment)
                .commit();
        System.out.println("还没添加呢");
    } else {
        transaction
                .hide(currentFragment)
                .show(targetFragment)
                .commit();
        System.out.println("添加了( ⊙o⊙ )哇");
    }
    currentFragment = targetFragment;
}

****价值源于技术,贡献源于分享****

相关文章

网友评论

  • 990edf13b871:用replace可以压栈优化,用add也会有重叠问题,只要做点处理都可以很好的优化
    AlicFeng: @于之_36e8 遇到什么问题了吗
    34add0151bb7:“用replace可以压栈优化” 能说具体点吗,求教,谢谢
  • 黄光华:非常感谢。前不久注意到这个问题,但网上搜到的解决方法感觉都说不清楚。您的这篇很简洁明了!谢谢分享!
    另外,如果启动activity时就使用了此方式去给该activity添加第一个fragment,则此时currentFragment==null,就会奔溃。添加一下判断就可解决问题:

    if (!targetFragment.isAdded()) {
    //第一次使用switchFragment()时currentFragment为null,所以要判断一下
    if(currentFragment != null) {
    transaction.hide(currentFragment);
    }
    transaction.add(R.id. main_fragment, targetFragment);
    transaction.commit();
    }
  • 左蓝:不明觉厉(⊙o⊙)!

本文标题:Android优化之切换Fragment

本文链接:https://www.haomeiwen.com/subject/pmobrttx.html