请求ROOM时是否可以直接使用LiveData?

问题描述 投票:1回答:2

尝试尝试mvvm和livedata,我在数​​据库房间有一个查询

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

@Query("SELECT * FROM User ")
fun getAllUsersRx(): Flowable<MutableList<User>> 

我从ViewModel调用方法,两种情况都有,但是如果一切都在另一个线程中通过rx工作,那么在LiveData的情况下,一切都应该发生在mainThread中。但是那么为什么房间没有给出错误IllegalStateException:无法访问主线程上的数据库?在这种情况下,使用LiveData直接从Room请求数据是否正确,或者我是否需要自己将操作转移到另一个线程?

android database rx-java android-room android-livedata
2个回答
0
投票

那么在LiveData的情况下,一切都应该发生在主线程中。

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

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

因为查询是在后台线程上执行的,所以当获取任务时,通过liveData.postValue(queriedData)传递给UI线程。

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

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


你不需要Rx让Room在后台线程上运行它的查询,单独使用LiveData就足够了。


-1
投票

那么在LiveData的情况下,一切都应该发生在主线程中

您可以允许在DataBase构建器中通过.allowMainThreadQueries()在主线程上运行。

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

因为当你使用room-rxjava2时它会处理你所有的线程。

我需要自己将操作转移到另一个线程?

您应该使用SubscribeOn(...)关键字EXPLICITLY指定要处理请求的线程。

此[subscribeOn]仅影响Observable订阅时使用的线程,并且它将保留在下游。 source

...
.getAllUsersRx()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulars.mainThread)
.subscribe(...)
© www.soinside.com 2019 - 2024. All rights reserved.