FragmentTransaction的commit的异步操作
来源:互联网 发布:双色球霸主软件怎么样 编辑:程序博客网 时间:2024/05/11 08:32
FragmentTransaction是异步的,commit()仅是相当于把操作加入到FragmentManager的队列,然后FragmentManager会在某一个时刻来执行,并不是立即执行。所以,真正开始执行commit()时,如果Activity的生命周期发生了变化,比如走到了onPause,或者走到了onStop,或者onDestroy都走完了,那么就会报出IllegalStateException。
这个地方确实是很坑的,我在做一个功能,需要从FragmentA跳转到FragmentB,然后调用FragmentB的刷新方法,那我的思路是从FragmentA和B的MainActivity中将A隐藏,将B显示,然后调用刷新。
于是我先将A隐藏B显示
private void switchFragment(Fragment newFragment) { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); LogCat.i("newFragment isAdded=" + newFragment.isAdded()); if (newFragment.isAdded()) { transaction.hide(mCurrentFragment).show(newFragment).commitAllowingStateLoss(); } else { transaction.hide(mCurrentFragment).add(R.id.main_content, newFragment).commitAllowingStateLoss(); } mCurrentFragment = newFragment; }
然后,再switchFragment之后调用FragmentB的刷新功能,但是问题出现了,发现FragmentB里面的一些空间没有初始化,打了log之后发现,初始化在我的初始化在我的刷新功能后面执行,查了资料发现,FragmentTransaction的commit方法是异步的,难怪~
解决方法:executePendingTransactions
在用FragmentTransaction.commit()方法提交FragmentTransaction对象后,会在进程的主线程中,用异步的方式来执行。如果想要立即执行这个等待中的操作,就要调用这个方法(只能在主线程中调用)。要注意的是,所有的回调和相关的行为都会在这个调用中被执行完成,因此要仔细确认这个方法的调用位置。
于是我重写switchFragment方法
FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); if (fragment.isAdded()) { transaction.hide(mCurrentFragment).show(fragment).commitAllowingStateLoss(); } else { transaction.hide(mCurrentFragment).add(R.id.main_content, fragment).commitAllowingStateLoss(); } mCurrentFragment = fragment; fm.executePendingTransactions(); ((DiscoverFragment) fragment).refresh(searchWord);
多加了一句fm.executePendingTransactions();
就OK了
遇到的问题,特此记录
- FragmentTransaction的commit的异步操作
- FragmentTransaction的commit和commitAllowingStateLoss的区别
- FragmentTransaction的commit和commitAllowingStateLoss的区别
- FragmentTransaction的commit和commitAllowingStateLoss的区别
- FragmentTransaction的commit和commitAllowingStateLoss的区别
- FragmentTransaction的commit和commitAllowingStateLoss的区别
- FragmentTransaction的commit和commitAllowingStateLoss的区别
- FragmentTransaction的commit和commitAllowingStateLoss的区别
- FragmentTransaction的commit和commitAllowingStateLoss的区别
- FragmentTransaction的commit和commitAllowingStateLoss的区别
- Android:FragmentTransaction的commit 和addToBackStack的方法随记
- Android Fragment的FragmentTransaction 操作和对应的生命周期变化
- FragmentTransaction&Activity的状态
- FragmentTransaction的回退栈
- FragmentTransaction&Activity的状态
- git commit的一些操作
- 探索FragmentTransaction#commit()抛出IllegalStateException
- FragmentTransaction.addToBackStack无效的问题:
- Android UI 控件之TextView
- 【架构篇】Android移动app架构设计浅谈
- 小白笔记--------------二分搜索算法
- 字符串应用(2)基本例程
- MR案例之倒排索引TF-IDF
- FragmentTransaction的commit的异步操作
- win7win8 64位汇编开发环境合集安装与设置
- httpclient 4.5.1---状态管理
- iOS SDK与Xcode
- oracle_触发器监控修改字段的客户端IP、用户名、新旧值
- mybatis中mapper类型的XML
- Build.gradle详细配置说明
- Numpy库进阶教程(一)求解线性方程组
- 使用SOCKET实现TCP/IP协议的通讯