为什么在下面的代码中使用suspend函数,即使它们不是suspend函数,这些函数也不能在另一个线程(不是主线程)上运行吗?
@Dao
interface ItemDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(item: Item)
@Update(onConflict = OnConflictStrategy.REPLACE)
suspend fun update(item: Item)
@Delete
suspend fun delete(item: Item)
@Query("SELECT * FROM items")
fun getAllItems(): Flow<List<Item>>
@Query("SELECT * FROM items WHERE item_id = :itemId")
fun getItem(itemId: Item): Flow<Item>
}
3条答案
按热度按时间ekqde3dh1#
suspend
修饰符强制您从协程作用域调用函数。如果没有它,您可以在不创建协程作用域的情况下调用它。因此,如果您不小心从主线程调用它,它将阻止您的UI,直到它完成执行。因此,使用suspend修改器,您必须执行以下操作:
如果没有suspend函数,你也可以这样做
希望它能回答你的问题。
iszxjhcz2#
据我所知,Android Studio实际上并没有向您显示警告,但
room
库不想在主线程上工作并停止主线程渲染View
,因此当您尝试在主线程上运行它时,它会抛出错误。Suspend关键字除了防止您编写可能会阻塞主线程并“冻结”应用程序的代码外,实际上没有做任何事情,因为IDE会突出显示它并提供更好的支持。lp0sw83n3#
挂起函数是所有协程的核心。挂起函数只是一个可以暂停并在稍后恢复的函数。它们可以执行一个长时间运行的操作,并等待它完成而不阻塞。
如果不使用suspend函数,则必须尝试不同的方法和技术,而不会阻塞主线程。