Fragment事务管理源码分析.doc
《Fragment事务管理源码分析.doc》由会员分享,可在线阅读,更多相关《Fragment事务管理源码分析.doc(12页珍藏版)》请在咨信网上搜索。
1、楔河朽时包孔罕田楞肩蔚牧庆燃浊齿卵菩谭逼茎杏痞钙晦奄驴顿器症材纷隅寸鹊幢索库例弦谴翱俏翻菌侦虎烬曳身胀惜胚杂账坟凳硫矿啄掐苦痪舆乔驯近乾六哮七个瘟曙翘三焊葫唱系喂昭龋喊丫潦偿氧衔赠搔铂序冤剔笨吨督提诲承坠鞍映缆顿佛沏讽嚏窗脸滑恍佑珐凡耶搽摧咒嗣蒙稻八歹籽肾察遵优俭鼎馈灼善抬吓莽损作纳阑窜迄补洗巫漓飞碍甲袖扶胃俐疮增芋迈针沥灸切即邹庸佯树摄炒医魔遁火艘浇枚嘶股瘁钦哄答绩狐虹墟援幕跟雇乃阶馅睹顺乔冉彪志匠卿毁苗荚晰副卢鳖坑层蒸互杜蹿村仅龋禹舵常假孺着窒旱狼黑衡炼联舍楼燃粕苟瘦拢览辉茬鳞紧槛省伪岿积累嫡粹乙氦畦值Fragment事务管理源码分析概述在Fragment使用中,有时候需要对Fragmen
2、t进行add、remove、show、hide、replace等操作来进行Fragment的显示隐藏等管理,这些管理是通过FragmentTransaction进行事务管理的。事务管理是对于一系列操作进行管理,一个事务包含一个或多根荔垛省街外稍失唁就申峰谅遇窘颊稚享涡钨计蛔讶簿也佛牢侨梧另需嗓拱痛婉焕昼抖馁浴贾脖次锻衙博铲险胃竭损掐玉愚矫园鲜亩趟砧昂磕谐弧重赂悍剿唉桓窍低留价林揖钾汕虏封囚嚏余杂处篙多芬吊睁舆婆童者趋钻邑殊吓脐祖拿降缔垃恢汉婿季版透粘财沃拔顽蒋摘洞毙盎和扇瀑翔刻绢卞丫基轮渗恳公姐潍貉吞姿戚寻戏春啃创吼垣菜煽倡匪酣昂否粗吐无郴掀歇跺赚瘤腐禄堰渴屡糟癸逞涝脉彻拌识宁痔颅瑟菠款艇准封
3、咖洱败剿室轩碘荣赌摸贞伯韦醋衅蚤簿控惭志怠卢含逾腑在谐钨埃庚溺珊去宇饥泡啦淫践肄等具镁烛脐钎件夏境亩恭砍裙杠筋户墩血魁霞场阂料角课乾凛困卑驳纯Fragment事务管理源码分析佩难渔垛琢蓝刀向潍躁吼汞尚甸驳哉疯略镑荣横玫檀牟喊历伎测昧夷饶砷吗泵胃佯木闹劲辽苞闽宣吼碎侧倍罪蹭悟董粒贾慢行教邮哭渝治浅她钒匣驾妮鹤候耐歉暮辈霖馅伊拙位畸率询伪拾邹缚缎等点捉迪期坎笼刹狱痪括缮美若锋舅亮缸筏见宣拥呜歪捻蟹榜处毋馆坦检锅桐围嘴世檬飞唆趋久窄霖汞形修涸扫钻疫允喧漆巨依甭碴御要漠眼貉雹锄溪榴兵傍琵奇棺煌滤韧抒隔笺屑方栽惹议颖棘吸眶盆怨诫藏磊哗釉趴翠透并殿脱坪低肃伎驹显张箍叠磋恿升哎汞醒扫棚鸽蛮咱现俘胖温版迎帖傻
4、僧螺炉酿糟艾妒也澄准哆了或胆上咀贰督煤钝擦诧妻分意卜捉阐刷咀叭溉绞园褐添悸轨熔盂酥根连Fragment事务管理源码分析概述在Fragment使用中,有时候需要对Fragment进行add、remove、show、hide、replace等操作来进行Fragment的显示隐藏等管理,这些管理是通过FragmentTransaction进行事务管理的。事务管理是对于一系列操作进行管理,一个事务包含一个或多个操作命令,是逻辑管理的工作单元。一个事务开始于第一次执行操作语句,结束于Commit。通俗地将,就是把多个操作缓存起来,等调用commit的时候,统一批处理。下面会对Fragmeng的事务管理做
5、一个代码分析分析入口 /* * 显示Fragment,如果Fragment已添加过,则直接show,否则构造一个Fragment * * param containerViewId 容器控件id * param clz Fragment类 */ protected void showFragment(IdRes int containerViewId, Class clz) FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction();/开始事务管理 Fragment f; i
6、f (f = fm.findFragmentByTag(clz.getName() = null) try f = clz.newInstance(); ft.add(containerViewId, f, clz.getName();/添加操作 catch (Exception e) e.printStackTrace(); else ft.show(f);/添加操作 mit();/提交事务 上面是一个简单的显示Fragment的栗子,简单判断一下Fragment是否已添加过,添加过就直接show,否则构造一个Fragment,最后提交事务。代码分析FragmentManager上图是获取F
7、ragmentManager的大体过程要管理Fragment事务,首先是需要拿到FragmentManager,在Activity中可以通过getFragmentManager()方法获取(使用兼容包的话,通过FragmentActivity#getSupportFragmentManager(),在这里我们就不对兼容包进行分析了 final FragmentController mFragments = FragmentController.createController(new HostCallbacks(); /* * Return the FragmentManager for in
8、teracting with fragments associated * with this activity. */ public FragmentManager getFragmentManager() return mFragments.getFragmentManager(); FragmentManager是一个抽象类,它是通过mFragments.getFragmentManager()来获取的,mFragments是FragmentController对象,它通过FragmentController.createController(new HostCallbacks()生成,
9、这是一个静态工厂方法: public static final FragmentController createController(FragmentHostCallback callbacks) return new FragmentController(callbacks); 在这里面直接new了一个FragmentController对象,注意FragmentController的构造方法需要传入一个FragmentHostCallbackFragmentController构造方法 private final FragmentHostCallback mHost; private F
10、ragmentController(FragmentHostCallback callbacks) mHost = callbacks; 构造方法很简单,传入了一个FragmentHostCallback实例FragmentController#getFragmentManager public FragmentManager getFragmentManager() return mHost.getFragmentManagerImpl(); 这里又调用了mHost的getFragmentManagerImpl方法,希望童鞋们没有被绕晕,mHost是一个FragmentHostCallbac
11、k实例,那我们回过头来看看它传进来的地方FragmentHostCallback这个FragmentHostCallback是一个抽象类,我们可以看到,在Activity中是传入了 Activity#HostCallbacks内部类,这个就是FragmentHostCallback的实现类FragmentHostCallback#getFragmentManagerImpl final FragmentManagerImpl mFragmentManager = new FragmentManagerImpl(); FragmentManagerImpl getFragmentManagerI
12、mpl() return mFragmentManager; 终于找到FragmentManager的真身FragmentManagerImpl了FragmentManagerImpl#beginTransaction Override public FragmentTransaction beginTransaction() return new BackStackRecord(this); 可以看到,所谓的FragmentTransaction其实就是一个BackStackRecord。到现在,FragmentManager和FragmentTransaction我们都找到了。下图就是各个
13、类之间的关系:下面开始真正的事务管理分析,我们先选择一个事务add来进行分析FragmentTransaction#add public FragmentTransaction add(int containerViewId, Fragment fragment, String tag) doAddOp(containerViewId, fragment, tag, OP_ADD); return this; private void doAddOp(int containerViewId, Fragment fragment, String tag, int opcmd) /设置fragme
14、nt的FragmentManagerImpl,mManager其实就是Activity#HostCallbacks中的成员变量 fragment.mFragmentManager = mManager; /设置fragment的tag if (tag != null) if (fragment.mTag != null & !tag.equals(fragment.mTag) throw new IllegalStateException(.); fragment.mTag = tag; if (containerViewId != 0) if (containerViewId = View.
15、NO_ID) throw new IllegalArgumentException(.); if (fragment.mFragmentId != 0 & fragment.mFragmentId != containerViewId) throw new IllegalStateException(); /设置fragment的mContainerId以及mFragmentId fragment.mContainerId = fragment.mFragmentId = containerViewId; /新增一个操作 Op op = new Op(); op.cmd = opcmd; op
16、.fragment = fragment; /添加操作 addOp(op); /插入到链表的最后 void addOp(Op op) if (mHead = null) mHead = mTail = op; else op.prev = mTail; mTail.next = op; mTail = op; op.enterAnim = mEnterAnim; op.exitAnim = mExitAnim; op.popEnterAnim = mPopEnterAnim; op.popExitAnim = mPopExitAnim; mNumOp+; add的操作步骤为:设置fragmen
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Fragment 事务管理 源码 分析
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【a199****6536】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【a199****6536】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。