第一个 API 是:
FragmentManager.executePendingTransactions()
第二个 API 是:
FragmentTransaction.commitNow();
大家都清楚 Fragment很多 API 都是“异步”的,即并非是立即生效的.
那么这两个 API 有点“同步”的感觉。
请问:
- 这两个 API 有何作用?
- 这两个 API 有啥区别?
- 这两个 API 有什么使用场景么?
一些提示,两个 API 的一个使用场景。
你在 LifeCycle 的源码中可以看到:
public class ReportFragment extends Fragment {
private static final String REPORT_FRAGMENT_TAG = "androidx.lifecycle"
+ ".LifecycleDispatcher.report_fragment_tag";
public static void injectIfNeededIn(Activity activity) {
// ProcessLifecycleOwner should always correctly work and some activities may not extend
// FragmentActivity from support lib, so we use framework fragments for activities
android.app.FragmentManager manager = activity.getFragmentManager();
if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
// Hopefully, we are the first to make a transaction.
manager.executePendingTransactions();
}
}
你在 RxPermission 可以看到以下使用:
rivate RxPermissionsFragment getRxPermissionsFragment(@NonNull final FragmentManager fragmentManager) {
RxPermissionsFragment rxPermissionsFragment = findRxPermissionsFragment(fragmentManager);
boolean isNewInstance = rxPermissionsFragment == null;
if (isNewInstance) {
rxPermissionsFragment = new RxPermissionsFragment();
fragmentManager
.beginTransaction()
.add(rxPermissionsFragment, TAG)
.commitNow();
}
return rxPermissionsFragment;
}
更多问答 >>
-
每日一问 LifeCycle 对于 Lifecycle.Event 为啥不直接分发,而是通过 Lifecycle.State 中转?
2020-04-19 14:42 -
每日一问 ViewPager 这个流传广泛的写法,其实是有问题的!
2020-03-26 00:10 -
2020-03-23 23:45
-
每日一问 | 自定义控件测量模式真的和 match_parent,wrap_content 一一对应吗?
2020-03-30 01:01 -
每日一问 | Activity 启动动画对页面打开速度有影响吗?
2020-04-22 22:06 -
每日一问 | 很久以前有Activity.onResume就是界面可见的说法,这种说法错了多少?
2020-03-15 23:10 -
每日一问 RecyclerView卡片中持有的资源,到底该什么时候释放?
2020-03-10 21:11 -
每日一问 | 事件到底是先到DecorView还是先到Window的?
2020-03-03 23:25 -
每日一问 Android有个GestureDetector很好用?那么你知道它内部是如何实现的吗?
2020-03-02 23:56 -
每日一问 很多时候我们说单例实现方式会提到「枚举实现」,那么枚举底层是如何实现的呢?
2020-02-23 22:18

这两个方法的作用 @DSG 同学已经说了,就是它们都会马上处理已提交的事务(区别在于
这里再补充一个区别:executePendingTransactions会对所有提交了的事务生效)。commitNow是不允许本次事务有添加到返回栈的操作的,为什么呢?就是因为commitNow是对单个事务生效,也就是插队行为了,这样一来,如果在这次事务提交之前,有其他事务通过普通方式提交了,并且它们也有添加到返回栈的话,那么这个栈的顺序就会被打乱了。看一下它的源码:它会在第一时间调用
disallowAddToBackStack方法:可以看到它是根据
mAddToBackStack来判断抛不抛出IllegalStateException的,而mAddToBackStack会在addToBackStack方法调用时标记为true:emmmm,那么为什么
其实仔细想一下就知道了:因为这个方法是对所有已提交的事务生效的,也就是说那些事务都会在同一时间内相继被执行,不存在插队行为。executePendingTransactions就没问题呢?至于各自的适用场景,从它们的区别就能想到:
如果本次操作不需要添加到返回栈,那么可以使用commitNow,但要注意此方法不可在Activity的onSaveInstanceState回调之后调用,如果确实有这样的需求(比如请求接口,根据接口返回状态来操作Fragment),可以用commitNowAllowingStateLoss来代替,但这个方法同样不允许addToBackStack的,如果要添加到返回栈,就要用commitAllowingStateLoss+executePendingTransactions了。好,来总结一下:
onSaveInstanceState回调后能使用现在看回题目中举的RxPermission的例子,它是使用
commitNow方法来提交事务,其实也很容易理解,因为这里的Fragment只是用来请求权限,并不需要添加到返回栈(根本就不可见)。🔥🔥🔥
✔
√
✔
**@鸿神** 打勾的符号显示不了 _(:з」∠)_ ,变成heavy_check_mark了
let me 探索一哈
支持了
哇!太棒啦!
大佬 基本每个问题都能看见你啊🔥
首先 executePendingTransactions 和 commitNow都可以将Fragment变成同步执行
我们知道 Fragment很多api都是异步执行的 会发送到主线程的任务队列里面executePendingTransactions 会将我们的commit立即执行 并且会将Transactions队列前面的所有操作都执行 我们会执行很多不必要的操作commitNow 只执行当前的transaction