kotlin 在Room Dao的函数中添加suspend关键字除了强制它作为协程启动外,还有什么目的?

blmhpbnm  于 2023-06-24  发布在  Kotlin
关注(0)|答案(1)|浏览(197)

我们可以选择有或没有suspend关键字,为房间刀功能。

@Dao
interface UserDao {
    @Update
    suspend fun updateUsers(vararg users: User)
}

@Dao
interface UserDao {
    @Update
    fun updateUsers(vararg users: User)
}

无论使用哪种方式,我们仍然可以在Coroutine启动中执行它。

val singleThreadDispatcher = Executors.newSingleThreadExecutor().asCoroutineDispatcher()

lifecycleScope.launch(singleThreadDispatcher) {
    userDao.updateUsers(....
}

如果是这样的话,房间道的功能有suspend关键字的真正目的是什么?

nwlls2ji

nwlls2ji1#

非挂起功能:

  • 通过阻塞进行等待。
  • 每当我们等待某个东西时,我们让线程进入睡眠状态。线程在等待的时候不能做其他事情,它一直被我们的函数占用。
  • 非挂起函数不能挂起。

暂停功能:

  • 通过挂起进行等待。
  • 每当我们等待某个东西时,线程就可以自由地做其他事情,例如运行另一个协程。
  • 暂停功能在技术上是能够阻止/睡眠的,但它几乎不应该这样做。导致协程无响应(例外:Dispatchers.IO

这些是一般规则,它们不仅适用于房间。
如果我们在应用程序中不使用协程,我们别无选择--我们必须使用非挂起函数,因为我们无法轻松执行suspend函数。
如果我们使用协程,suspend函数对协程更友好。suspend函数“说”它将以最佳方式使用协程/线程。我们可以使用非挂起函数,然后通过使用Dispatchers.IO从协程执行它,但是挂起函数可以以更优化的方式使用资源。
通过在Room中切换非挂起和挂起功能,我们使其选择一个完全不同的实现。其中一个通过阻塞等待,另一个通过挂起等待,因此允许线程转到其他地方。
顺便说一句,在你的特定示例中,使用非挂起函数是完全错误的。如上所述,非挂起函数通过阻塞等待,而lifecycleScope使用主线程,因此这段代码实际上阻塞了UI。

相关问题