尝试尝试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请求数据是否正确,或者我是否需要自己将操作转移到另一个线程?
那么在LiveData的情况下,一切都应该发生在主线程中。
您在主线程上观察它并在主线程上接收查询的项目,但查询本身在ArchTasksExecutors.ioThread()
执行程序(后台线程)上执行。
但是那么为什么房间没有给出错误IllegalStateException:无法访问主线程上的数据库?
因为查询是在后台线程上执行的,所以当获取任务时,通过liveData.postValue(queriedData)
传递给UI线程。
在这种情况下,使用LiveData直接从Room请求数据是否正确,或者我是否需要自己将操作转移到另一个线程?
LiveData自动处理“查询后台线程,并将结果传递给UI线程”。您可以检查生成的代码是如何发生的,但从技术上讲,Room已经为您完成了这项工作。
你不需要Rx让Room在后台线程上运行它的查询,单独使用LiveData就足够了。
那么在LiveData的情况下,一切都应该发生在主线程中
您可以允许在DataBase构建器中通过.allowMainThreadQueries()
在主线程上运行。
但是那么为什么房间没有给出错误IllegalStateException:无法访问主线程上的数据库?
因为当你使用room-rxjava2
时它会处理你所有的线程。
我需要自己将操作转移到另一个线程?
您应该使用SubscribeOn(...)
关键字EXPLICITLY指定要处理请求的线程。
此[subscribeOn]仅影响Observable订阅时使用的线程,并且它将保留在下游。 source
...
.getAllUsersRx()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulars.mainThread)
.subscribe(...)