我正在学习livedata和room db,但我不能不理解一件事:文档说所有room查询都应该在另一个线程中执行,但是我需要的某些查询应该在主线程中执行。为什么? 想象:我有一个聊天应用程序,当有消息发送到该应用程序时,我需要先检查该消息的发件人(如果被应用程序用户阻止),然后再向用户显示消息。所以我需要在主线程中执行此操作。如何在房间里处理这种情况?
Ps:我不想使用allowMainThreadQueries()
,因为我的查询大部分都在另一个线程中。
答案 0 :(得分:2)
想象:我有一个聊天应用
大概是使用网络。您的网络I / O最好放在后台线程上,否则会遇到更大的问题。
...并且当有消息发送到应用程序时,我需要先检查此消息的发件人是否被应用程序用户阻止,然后再向用户显示消息。
因此,当出现聊天消息时,您已经在后台线程上。您可以在该后台线程上查询数据库,以查看发件人是否在阻止列表中。
所以我需要在主线程中执行此操作。
否,因为您的网络I / O在后台线程上。在将结果传递给用户之前,请在同一线程上进行被发件人阻止的检查。
即使由于某种原因在检查数据库之前在主应用程序线程上显示了消息,您仍然可以在(不同的)后台线程上检查数据库,并且仅在检查之后才将消息添加到UI。 / p>