Android开发者页面说道:
默认情况下,所有查询(@Query)必须在主线程以外的线程上执行。对于插入或删除之类的操作,如果您使用提供的便利注解,Room会为您管理线程。
来源:https://google-developer-training.github.io/android-developer-advanced-course-practical/unit-6-working-with-architecture-components/lesson-14-room,-livedata,-viewmodel/14 - 1-a-room-livedata-viewmodel/14 -1-a-room-livedata-viewmodel.html#task3intro
但这是不正确的,对吗?Room不会在后台线程上自动运行插入和删除操作。那么这句话是什么意思呢?
3条答案
按热度按时间7ajki6be1#
这意味着这些房间操作是thread-safe(因此,如果您使用了thread-safe,则不必考虑它)。在不同的后台线程上运行插入/删除操作,source)
ao218c7q2#
默认情况下你不能在主线程上运行房间操作。您可以使用
.allowMainThreadQueries()
在主线程中运行它们。或者您必须创建一个
AsyncTask
来执行房间查询。如果你正在使用room运行长时间运行的操作,你应该使用
AsyncTask
,因为在主UI线程上运行长时间运行的操作可能会导致UI阻塞。neekobn83#
如果您使用提供的便利注解,Room会为您管理线程。
这意味着,当您在
Dao
接口中使用这些Room注解时;如果这些修改(更新、插入和删除)在不同的后台线程中运行,则Room会处理这些修改。房间不提供这个背景线程虽然;但是它可以管理来自不同线程的多个请求。这也可能是因为当使用这样的注解时,这些方法中的每一个都在单独的事务(documentation reference)中运行。数据库事务操作是独立的操作,不会相互影响。
一些数据库系统限制在多个线程中同时使用同一数据库连接;房间没有,房间照顾这一点,因为它的线程安全。