博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FragmentTransaction的commit的异步操作
阅读量:5741 次
发布时间:2019-06-18

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

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方法是异步的,难怪~

解决方法:

这里写图片描述

在用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了

遇到的问题,特此记录

    本文转自 一点点征服   博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/7517803.html,如需转载请自行联系原作者

你可能感兴趣的文章
基础知识:python模块的导入
查看>>
Android MVC之我的实现
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
关于批处理-1
查看>>
Tomcat部署Web应用方法总结
查看>>
Python3 django2.0 字段加密 解密 AES
查看>>
CCNA实验之:网络地址转换(NAT)实验
查看>>
计算机网络原理笔记-停止等待协议
查看>>
确定当前记录和下一条记录之间相差的天数
查看>>
sql语句返回主键SCOPE_IDENTITY()
查看>>
机器学习开源项目精选TOP30
查看>>
代码分析系列 内存执行过程
查看>>
iOS开发-邮件发送
查看>>
/etc/resolv.conf文件详解
查看>>
【转】VC的MFC中重绘函数的使用总结(整理)
查看>>
JQuery日记_5.13 Sizzle选择器(六)选择器的效率
查看>>
oracle查看经常使用的系统信息
查看>>
Django_4_视图
查看>>
Linux的netstat命令使用
查看>>