commitAllowingStateLoss和commit
时间: 2023-11-09 22:00:39 浏览: 43
commitAllowingStateLoss和commit是FragmentTransaction类中的两个方法,用于提交Fragment的变化。
commit方法是同步的,即当调用commit方法时,会立即执行Fragment事务的提交操作。它会将Fragment的变化添加到FragmentManager的操作队列中,并在主线程中执行。
而commitAllowingStateLoss方法是异步的,在执行commitAllowingStateLoss方法时,不会立即提交Fragment的变化,而是将变化添加到FragmentManager的操作队列中,但它允许在Activity的状态已经保存(例如在Activity被暂停或停止时)时调用。这意味着,如果在Activity状态保存前调用了commitAllowingStateLoss方法,那么即使Activity状态已经保存,Fragment的变化仍然会被提交。
需要注意的是,在可以避免出现异常情况下,应尽量使用commit方法而不是commitAllowingStateLoss方法,以保证Fragment事务的安全性和一致性。
相关问题
FragmentTransaction中commitAllowingStateLoss和commit的区别
在使用 FragmentTransaction 进行 Fragment 切换时,我们需要调用 commit() 方法来提交切换操作。但是在某些情况下,可能会出现 Activity 已经被销毁,但是 FragmentTransaction 还未执行完毕的情况,这时候如果再次调用 commit() 方法,就会抛出 IllegalStateException 异常。为了解决这个问题,Android 提供了两个方法:commit() 和 commitAllowingStateLoss()。
它们的主要区别如下:
1. commit() 方法调用时会执行 FragmentTransaction 的同步操作,如果 Activity 已经被销毁,就会抛出 IllegalStateException 异常,而 commitAllowingStateLoss() 方法则会忽略这个异常,不会抛出错误。因此,在可能出现 Activity 生命周期不稳定的情况下,建议使用 commitAllowingStateLoss() 方法。
2. commit() 方法会将 FragmentTransaction 添加到 Activity 的任务队列中,等待 Activity 执行完毕后再去执行,而 commitAllowingStateLoss() 方法会立即执行 FragmentTransaction,不会等待 Activity 执行完毕。
因此,在使用 FragmentTransaction 进行 Fragment 切换时,如果你确定当前 Activity 生命周期稳定,可以使用 commit() 方法。如果你无法确定当前 Activity 生命周期稳定,建议使用 commitAllowingStateLoss() 方法。
Android commitAllowingStateLoss和commitNow 、commit的区别
这三个方法都是用于提交 FragmentTransaction 的,但是它们有一些区别。
1. commit
commit() 方法是将 FragmentTransaction 添加到 Fragment 管理器的事务队列中,然后在下一次执行该队列时执行。如果你立即想要执行事务,可以调用 executePendingTransactions() 方法。
2. commitAllowingStateLoss
commitAllowingStateLoss() 方法与 commit() 方法非常相似,但是它允许在 Activity 状态保存时提交 FragmentTransaction。这意味着如果 Activity 在提交事务时发生了销毁或重建,可能会丢失该事务的更改。因此,只有在你确定不会发生此类情况时才应使用此方法。
3. commitNow
commitNow() 方法与 commit() 方法类似,但是它会立即执行事务,而不是将其添加到队列中。如果你需要立即执行事务,则可以使用此方法。
需要注意的是,commitAllowingStateLoss() 和 commitNow() 方法仅适用于 API 级别 24 或更高版本。如果你需要支持较早版本的 Android,建议使用 commit() 方法。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)