Fragment几种不同的commit方法
FragmentTransaction
是用于在 Android 应用中执行 Fragment 操作的类,如添加、替换、移除等
先要了解一下Activity的销毁和重建以及状态保存:在 Android 中,"Activity 状态保存" 是指系统在 Activity 可能被销毁或重建之前保存其当前状态的过程。这通常发生在以下场景:
- 设备旋转:当用户旋转设备时,屏幕方向改变,系统会销毁并重建当前的 Activity。
- 后台进程:当用户将应用程序切换到后台,系统可能会在内存不足时销毁后台 Activity,以释放资源。
- 配置改变:如语言改变、屏幕尺寸变化等。
当上述情况发生时,系统会调用Activity的 onSaveInstanceState()
方法,允许开发者将需要保存的数据存储到一个 Bundle
对象中,这个Bundle对象会在Activtiy重建时传递回onCreate() 或 onRestoreInstanceState() 方法中,可以通过这个Bundle恢复之前的保存的状态。
1. commit()
- 描述: 这是最常用的提交方式,提交事务以
异步方式
执行。 - 工作原理: 当调用
commit()
时,事务会被添加到主线程的消息队列中,并在主线程空闲时执行。因此,实际的提交不会立即发生,而是在下一次主线程循环时。 - 优点: 这种提交方式更安全,因为它避免了在 Activity 状态已经保存的情况下执行事务,防止潜在的状态丢失。
- 缺点: 由于是异步提交,如果事务在 Activity 的状态保存(如旋转屏幕或后台切换)后提交,可能会导致 IllegalStateException。
2. commitNow()
- 描述: 立即同步地提交事务,阻塞主线程直到所有操作完成。
- 工作原理: 事务会立即执行,不会添加到主线程队列中。这意味着 commitNow() 方法不会返回,直到所有的事务操作完成。
- 优点: 适用于需要立即看到结果的场景。
- 缺点: 由于是同步执行,可能会影响性能,尤其是在事务中包含耗时操作时。
3. commitAllowingStateLoss()
- 描述: 和 commit() 类似,但允许在 Activity 状态已经保存的情况下提交事务,避免崩溃。
- 工作原理: 这是 commit() 的一种变体,如果在状态保存后提交事务,它不会抛出异常,而是直接提交事务,即使这可能导致某些状态丢失。
- 使用场景: 通常在你非常确定即使状态丢失也不会导致问题的情况下使用,或者当你优先考虑事务的完成,而不是避免潜在状态丢失的情况。
4. commitNowAllowingStateLoss()
- 描述: 立即同步地提交事务,并且允许状态丢失。
- 工作原理: 这是 commitNow() 的变体,允许在 Activity 状态保存后执行事务,同样是同步执行,阻塞主线程直到操作完成。
- 使用场景: 当你需要立即执行事务,并且可以接受状态丢失的风险时使用。
5. 总结
commit
: 异步提交事务,较为安全。commitAllowingStateLoss
: 异步提交事务,允许状态丢失,避免崩溃。commitNow
: 同步提交事务,立即执行,但可能影响性能。commitNowAllowingStateLoss
: 同步提交事务,允许状态丢失,立即执行。