FragmentTransaction的commit的异步操作

Posted 一点点征服

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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了

遇到的问题,特此记录





以上是关于FragmentTransaction的commit的异步操作的主要内容,如果未能解决你的问题,请参考以下文章

操作栏在 FragmentTransaction replace() 和 FragmentTransaction add() 上的行为方式

FragmentTransaction.remove 没有效果

导航抽屉:fragmentTransaction.commit() 使我的应用程序崩溃

FragmentActivity 与使用 FragmentTransaction 管理 Fragment?

使用 FragmentPagerAdapter 的 FragmentTransaction

Android FragmentTransaction.addToBackStack 混淆