Android 请求房间时是否可以直接使用LiveData?

Android 请求房间时是否可以直接使用LiveData?,android,database,rx-java,android-room,android-livedata,Android,Database,Rx Java,Android Room,Android Livedata,在尝试mvvm和livedata时,我在数据库室中有一个查询 @Query("SELECT * FROM User ") fun getAllUsers(): LiveData<MutableList<User>> @Query("SELECT * FROM User ") fun getAllUsersRx(): Flowable<MutableList<User>> 我从ViewModel调用这些方法,在这两种情况下,所有内容都会出现,但

在尝试mvvm和livedata时,我在数据库室中有一个查询

@Query("SELECT * FROM User ")
fun getAllUsers(): LiveData<MutableList<User>>

@Query("SELECT * FROM User ")
fun getAllUsersRx(): Flowable<MutableList<User>> 
我从ViewModel调用这些方法,在这两种情况下,所有内容都会出现,但是如果所有内容都通过rx在另一个线程中工作,那么在LiveData的情况下,所有内容都应该在主线程中发生。但是,为什么Room没有给出错误IllegalStateException:无法访问主线程上的数据库?在这种情况下,使用LiveData直接从Room请求数据是正确的,还是我需要自己将操作转移到另一个线程

然后,对于LiveData,所有事情都应该发生在主线程中

您在主线程上观察它并在主线程上接收查询的项目,但查询本身在ArchTasksExecutors.ioThread executor后台线程上执行

但是,为什么Room没有给出错误IllegalStateException:无法访问主线程上的数据库

因为查询是在后台线程上执行的,所以在完成获取任务时,会通过liveData.postValuequeriedData传递给UI线程

在这种情况下,使用LiveData直接从Room请求数据是正确的,还是我需要自己将操作转移到另一个线程

LiveData处理后台线程上的查询,并将结果自动传递给UI线程。您可以在生成的代码中检查这是如何发生的,但从技术上讲,Room已经为您完成了这项工作

您不需要Rx在后台线程上运行其查询,仅LiveData就足够了