Skip to content

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. 总结

  1. commit: 异步提交事务,较为安全。
  2. commitAllowingStateLoss: 异步提交事务,允许状态丢失,避免崩溃。
  3. commitNow: 同步提交事务,立即执行,但可能影响性能。
  4. commitNowAllowingStateLoss: 同步提交事务,允许状态丢失,立即执行。

Released under the MIT License.