我只是好奇我是否必须在UI线程上调用它。根据文档,commit将在将来有时间的时候在UI线程上运行。如果是这样,我可以在另一个线程上运行FragmentTransaction.commit()吗?
commit
FragmentTransaction.commit()
aurhwmvo1#
这个问题已经有一年了,但我想解决它,因为我怀疑这是一个很多人都会遇到的问题。使用FragmentTransaction,包括调用commit方法,* 在非UI线程 * 上进行是安全的,因为FragmentTransaction中发生的任何工作都不会直接操作UI。FragmentTransaction上的方法调用只是打包为要执行的工作指令列表。一旦调用了commit方法,该指令包就会被发送到UI线程进行处理。
ntjbwcob2#
不太清楚你的意思。你可能总是有任何其他线程发送消息给调用FragmentTransaction.commit()的UI线程。但是,我不太理解为什么在所有事务之后不立即调用commit。我甚至希望你甚至可能会遇到NullPointer错误,如果有任何改变的片段或其依赖的数据-在延迟期间,我的意思是-这会导致你的应用程序的不同状态,而不是当你立即调用提交。同样在这种情况下,你应该调用fragmentManager.executePendingTransactions()来确保你的所有更改都将被执行,否则你可能会认为事务已经发生了--事实上它们还没有发生。
fragmentManager.executePendingTransactions()
8oomwypt3#
以防有人像我一样需要2023年最新的答案,它是线程安全的。正如官方文件所说:提交不会立即发生;它将被调度为主线程上的工作,以便在下一次线程准备就绪时完成。我在自己的代码中尝试在非UI线程中提交一个片段事务,它工作得很好,没有崩溃。
3条答案
按热度按时间aurhwmvo1#
这个问题已经有一年了,但我想解决它,因为我怀疑这是一个很多人都会遇到的问题。
使用FragmentTransaction,包括调用commit方法,* 在非UI线程 * 上进行是安全的,因为FragmentTransaction中发生的任何工作都不会直接操作UI。FragmentTransaction上的方法调用只是打包为要执行的工作指令列表。
一旦调用了commit方法,该指令包就会被发送到UI线程进行处理。
ntjbwcob2#
不太清楚你的意思。你可能总是有任何其他线程发送消息给调用FragmentTransaction.commit()的UI线程。
但是,我不太理解为什么在所有事务之后不立即调用commit。
我甚至希望你甚至可能会遇到NullPointer错误,如果有任何改变的片段或其依赖的数据-在延迟期间,我的意思是-这会导致你的应用程序的不同状态,而不是当你立即调用提交。
同样在这种情况下,你应该调用
fragmentManager.executePendingTransactions()
来确保你的所有更改都将被执行,否则你可能会认为事务已经发生了--事实上它们还没有发生。8oomwypt3#
以防有人像我一样需要2023年最新的答案,它是线程安全的。
正如官方文件所说:
提交不会立即发生;它将被调度为主线程上的工作,以便在下一次线程准备就绪时完成。
我在自己的代码中尝试在非UI线程中提交一个片段事务,它工作得很好,没有崩溃。