kotlin 暂停功能的目的

7fyelxc5  于 2023-06-24  发布在  Kotlin
关注(0)|答案(3)|浏览(132)

为什么在下面的代码中使用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>
}
ekqde3dh

ekqde3dh1#

suspend修饰符强制您从协程作用域调用函数。如果没有它,您可以在不创建协程作用域的情况下调用它。因此,如果您不小心从主线程调用它,它将阻止您的UI,直到它完成执行。
因此,使用suspend修改器,您必须执行以下操作:

// Create a Coroutine Scope
viewModelScope.launch {
    // Move to an I/O optimized thread
    withContext(Dispatchers.IO) {
        ItemDao.insert(item)
    }
}

如果没有suspend函数,你也可以这样做

// From the default thread (Will block UI)
// Or any other thread (Won't block UI)
ItemDao.insert(item)

希望它能回答你的问题。

iszxjhcz

iszxjhcz2#

据我所知,Android Studio实际上并没有向您显示警告,但room库不想在主线程上工作并停止主线程渲染View,因此当您尝试在主线程上运行它时,它会抛出错误。Suspend关键字除了防止您编写可能会阻塞主线程并“冻结”应用程序的代码外,实际上没有做任何事情,因为IDE会突出显示它并提供更好的支持。

lp0sw83n

lp0sw83n3#

挂起函数是所有协程的核心。挂起函数只是一个可以暂停并在稍后恢复的函数。它们可以执行一个长时间运行的操作,并等待它完成而不阻塞。

如果不使用suspend函数,则必须尝试不同的方法和技术,而不会阻塞主线程。

相关问题