fragmentManager 进行事务提交时,transaction有四种commit方法可供调用,分别是:
commit() 、 commitAllowingStateLoss() 、commitNow() 、 commitNowAllowStateloss()
这四个方法有什么区别呢:
(1)先说commit() 和 commitAllowingStateLoss(),区别就是用commit时,有可能会报IllegalStateException,原因是他们在实现的不同点在于,当调用commit的时候,FragmentManager会检查是否已经存储了他自己的状态,如果已经存了(已经调用过FragmentManager的 saveAllState()方法(对应Activity的onSaveInstanceState),或者调用过dispatchStop()方法(对应Activity的onStop()方法),),就会抛出异常。所以推荐使用 commitAllowingStateLoss(),但是用commitAllowingStateLoss()也会引发状态丢失的问题,例如
1.在Activity里显示一个FragmentA;
2.然后Activity被后台, onStop()和onSaveInstanceState()被调用;
3.在某个事件触发下, 你用FragmentB replace FragmentA , 使用的是 commitAllowingStateLoss().
这时候, 用户再返回应用, 可能会有两种情况发生:
1.如果系统杀死了你的activity, 你的activity将会重建, 使用了上述步骤2保存的状态, 所以A会显示, B不会显示;
2.如果系统没有杀死你的activity, 它会被提到前台, FragmentB就会显示出来, 到下次Activity stop的时候, 这个包含了B的状态就会被存下来.
那么你要选择哪一种呢? 这就取决于你提交的是什么, 还有你是否能接受丢失.
(2)commit() 与commitNow() 的区别在于:
commit不是立即执行,会被发送到主线程的任务队列中去,当主线程准备好的时候开始执行,也就是异步的。但是有时候你希望操作是立即执行的,则就可以调用commitNow。
这里还有个注意情况,就是不能对要加在backStack中的transaction使用commitNow,即addToBackStack不能和commitNow同时使用,(原因是在addToBackStack中将mAddToBackStack 设置为true,而此时再调用commitNow方法时,如果mAddToBackStack 为true,则直接抛出异常)。