【问题标题】:Is it possible to use LiveData directly when requesting ROOM?请求 ROOM 时可以直接使用 LiveData 吗?
【发布时间】:2019-03-15 14:15:05
【问题描述】:

尝试尝试mvvm和livedata,我在数​​据库Room中有查询

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

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

我从 ViewModel 中调用方法,这两种情况都会发生,但如果一切都通过 rx 在另一个线程中工作,那么对于 LiveData,一切都应该在 mainThread 中发生。但是为什么 Room 没有给出错误 IllegalStateException: Cannot access the database on the main thread?在这种情况下直接使用LiveData向Room请求数据是否正确,还是需要我自己将操作转移到另一个线程?

【问题讨论】:

    标签: android database rx-java android-room android-livedata


    【解决方案1】:

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

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

    但是为什么 Room 没有给出错误 IllegalStateException: Cannot access the database on the main thread?

    因为查询是在后台线程上执行的,然后在 fetch 任务完成时通过liveData.postValue(queriedData) 传递给 UI 线程。

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

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


    您不需要 Rx 让 Room 在后台线程上运行它的查询,仅 LiveData 就足够了。

    【讨论】:

    • 有趣的发现...如果你在数据库中设置了allowMainThreadQueries,实时数据开始在主线程上执行查询。奇怪的权利
    猜你喜欢
    • 2017-07-18
    • 2012-02-05
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 2015-07-17
    相关资源
    最近更新 更多