FragmentTransaction的commit的异步操作

简介:

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了

遇到的问题,特此记录




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


相关文章
|
12月前
|
前端开发
10 # promise2 状态的处理
10 # promise2 状态的处理
48 0
|
5月前
|
存储
在actions中如何处理异步操作的错误
在Vuex的`actions`中,处理异步操作错误通常涉及捕获和处理。使用`try-catch`块能捕获如`axios`请求可能抛出的错误。
|
5月前
事务提交后回调
事务提交后回调
33 2
|
12月前
|
前端开发
13 # promise 的状态更改问题
13 # promise 的状态更改问题
53 0
|
前端开发 JavaScript Shell
手写 git hooks 脚本(pre-commit、commit-msg)
手写 git hooks 脚本(pre-commit、commit-msg)
416 0
|
Web App开发 前端开发 JavaScript
关于 Await、Promise 执行顺序差异问题
关于 Await、Promise 执行顺序差异问题
292 0
关于 Await、Promise 执行顺序差异问题
|
Java Spring 容器
你知道 @Async 是怎么让方法异步执行的吗?
@Async 是通过注解标记来开启方法的异步执行的;对于注解的底层实现,除了 java 原生提供那种依赖编译期植入的之外,其他的基本都差不多,即运行时通过反射等方式拦截到打了注解的类或者方法,然后执行时进行横切拦截;另外这里还有一个点就是方法异步执行,所以对于 @Async 的剖析,就一定绕不开两个基本的知识点,就是代理和线程池。 在了解到这些之后,我们来拆解下 @Async 的基本原理。
198 0
你知道 @Async 是怎么让方法异步执行的吗?
|
前端开发
使用Promise过程中resolve或reject后,后面代码还会执行
在日常开发中会用到Promise语法,里面有resolve和reject
2407 0
|
JSON 前端开发 JavaScript
fetch异步请求使用详解
fetch异步请求使用详解
fetch异步请求使用详解
|
开发框架 Java .NET
C# 同步 异步 回调 状态机 async await Demo
C# 同步 异步 回调 状态机 async await Demo 我们项目的客户端和服务端通信用的是WCF,我就想,能不能用异步的方式调用WCF服务呢?或者说能不能用async await的方式调用WCF服务呢?
572 0
C# 同步 异步 回调 状态机 async await Demo