博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android开发之多Fragment切换优化
阅读量:5823 次
发布时间:2019-06-18

本文共 3229 字,大约阅读时间需要 10 分钟。

问题分析


一直在简书里看别人的技术贴,今天我也来写点自己的心得!最近在写一个项目用到大量的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())        .commit();

 

诚然这两种都可以切换Fragment,但是面对用户大量点击来回切换,或者你的Fragment本来就很多,每次都这样操作,那么很快你的应用就会OOM,就算不崩那也会异常的卡顿!so why?

当我们replace时发生了以下的生命周期:

 

 
 

想想看每次都replace一下!!这世界会有多美好!!!那么问题出在哪?回过头看看代码就会发现每次在add/replace或者show/hide都会new 一个新的实例,这就是致命原因!!!!!

废话少说,开始优化


方案一:

预加载模式:

//首先需要先实例好三个全局Fragment FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.add(R.id.fragment, FirstFragment.getInstance()); ft.add(R.id.fragment, SecondFragment.getInstance()); ft.add(R.id.fragment, ThirdFragment.getInstance()); ft.hide(SecondFragment.getInstance()); ft.hide(ThirdFragment.getInstance()); ft.commit();

在加载第一个Fragment时就把全部Fragment加载好,下次使用直接调用如:

FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.hide(FirstFragment.getInstance())         .show(SecondFragment.getInstance())         .commit();

是不是总觉怪怪的,虽然比之前的代码好,但是这种做法很Java,当然需要预加载的朋友依然是不二之选!!!

那有没有更好的方法呢?答案是肯定的

方案二:

动态加载模式:

 

//首先需要先实例好n个全局Fragment//private  Fragment  currentFragment=new Fragment();(全局)private  FragmentTransaction switchFragment(Fragment targetFragment) {   FragmentTransaction transaction = getSupportFragmentManager()           .beginTransaction();   if (!targetFragment.isAdded()) {       //第一次使用switchFragment()时currentFragment为null,所以要判断一下       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时:@Overridepublic 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无论怎么切都不会出现卡顿了,因为你的所有Fragment只会被实例化一次!实例一次的Fragment会被存入内存中,下次切换会判断内存中是否含有要切换的Fragment,如果有就直接复用,没有就add一个新的!优化大法完成!

外番


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

 

 
 

要是这样,这样的软件真的要逆天了!好在官方提供了onHiddenChanged方法,每次切换hide或者show时该方法会被执行,可以在这里面更新数据!

//此方法在Fragment中

@Override

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

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

 

GitHub地址: (欢迎 fork 和 star)

注:提醒小白(老手请忽略)

此demo只供fragment理解,此样例app的业务逻辑建议ViewPager+Fragment或者其他。。。

作者:8金木研8
链接:https://www.jianshu.com/p/4c5f015b3b6c
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

转载于:https://www.cnblogs.com/Im-Victor/p/9556257.html

你可能感兴趣的文章
国外10大IT网站和博客网站
查看>>
android第十一期 - SmoothSwitchLibrary仿IOS切换Activity动画效果
查看>>
zabbix 批量web url监控
查看>>
MongoDB CookBook读书笔记之导入导出
查看>>
shell如何快速锁定所有账号
查看>>
HTML 5实现的手机摇一摇
查看>>
Linux 文件IO理解
查看>>
Ninject 2.x细说---2.绑定和作用域
查看>>
30个非常时尚的网页联系表单设计优秀示例
查看>>
使用membership(System.Web.Security)来进行角色与权限管理
查看>>
opticom 语音质量验证白皮书
查看>>
3D实时渲染中的BSP树和多边形剔除
查看>>
Frank Klemm's Dither and Noise Shaping Page: Dither and Noise Shaping In MPC/MP+
查看>>
网络抓包的部署和工具Wireshark【图书节选】
查看>>
Redis在Windows+linux平台下的安装配置
查看>>
Maven入门实战笔记-11节[6]
查看>>
Local declaration of 'content' hides instance variable
查看>>
ASP.NET中 HTML标签总结及使用
查看>>
Linux下日志系统的设计
查看>>
爬虫IP被禁的简单解决方法——切换UserAgent
查看>>