gpt4 book ai didi

android - 使用协程流时房间卡住->收集

转载 作者:行者123 更新时间:2023-12-02 01:47:51 28 4
gpt4 key购买 nike

我正在使用 Room(v. 2.2.1)和协程支持(v. 1.3.2)并进行以下设置

@Entity(tableName = "simple_table")
data class SimpleEntity(
@PrimaryKey(autoGenerate = true) val id: Long = 0
)

@Dao
interface SimpleDao {
@Query("SELECT * FROM simple_table WHERE id = :id")
fun getRecord(id: Long): Flow<SimpleEntity?>

@Insert
suspend fun insert(entity: SimpleEntity)
}

然后,在我将数据插入到自动生成的 id 1 的 simple_table 中后,我尝试查询

db.simpleDao.getRecord(1).collect {
//fetch data
}
db.close()

db.close() 永远不会到达。它只是卡住在 collect() 方法中。如果我将代码更改为

db.simpleDao.getRecord(1).first {
//fetch data
}

db.simpleDao.getRecord(1).take(1).collect {
//fetch data
}

然后就可以正常工作了。但为什么普通的collect()永远不会结束它们的执行呢?我的 Room 配置中缺少什么才能使其正常工作?

最佳答案

我遇到了同样的问题并且已经解决了

.collect {}之后的代码在同一个协程中不起作用!如果你这样写:

    MainScope().launch {

db.simpleDao.getRecord(1).collect {
//fetch data
}
/**
* My other code that will be freezed
* */

}

你应该这样写:

    MainScope().launch {

launch { //new coroutine
db.simpleDao.getRecord(1).collect {
//fetch data
}
// No code here
}
/**
* My other code that will not be freezed
* */

}

我认为这都是因为 slot.awaitPending() 被调用等待收集新值。

关于android - 使用协程流时房间卡住->收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58801240/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com