[英]Kotlin Coroutine Flow running in loop with room database
我正在构建一个聊天应用程序并使用 Coroutine Flow 更新我的回收器,但该流程在循环中运行并导致冻结和应用程序崩溃。
这是我的收藏家:
dao!!.getSingleUsersMessages(roomId = roomId!!, alternateRoomId = roomId2!!).collect { messages ->
CoroutineScope(Dispatchers.Main).launch {
adapter.populate(messages)
if (adapter.itemCount > 0) {
Timber.tag("issueTracker_").d(messages.size.toString())
//binding.chattingRecycler.smoothScrollToPosition(0)
}
withContext(Dispatchers.IO) {
dao!!.updateRead(roomId!!)
dao!!.updateRead(roomId2!!)
}
}
//cancel()
}
我的 Dao 查询:
@Query("SELECT * FROM message_table WHERE roomId=:roomId OR roomId=:alternateRoomId ORDER BY time DESC LIMIT 250")
fun getSingleUsersMessages(roomId: String, alternateRoomId: String) : Flow<List<Message>>
日志:
2021-12-02 11:19:29.129 14569-14569/com.example.chatapplication D/issueTracker_: 3
2021-12-02 11:19:29.146 14569-14569/com.example.chatapplication D/issueTracker_: 3
2021-12-02 11:19:29.164 14569-14569/com.example.chatapplication D/issueTracker_: 3
2021-12-02 11:19:29.181 14569-14569/com.example.chatapplication D/issueTracker_: 3
2021-12-02 11:19:29.199 14569-14569/com.example.chatapplication D/issueTracker_: 3
2021-12-02 11:19:29.217 14569-14569/com.example.chatapplication D/issueTracker_: 3
2021-12-02 11:19:29.244 14569-14569/com.example.chatapplication D/issueTracker_: 3
2021-12-02 11:19:29.261 14569-14569/com.example.chatapplication D/issueTracker_: 3
2021-12-02 11:19:29.263 14569-14569/com.example.chatapplication D/issueTracker_: 3
2021-12-02 11:19:29.297 14569-14569/com.example.chatapplication D/issueTracker_: 3
2021-12-02 11:19:29.316 14569-14569/com.example.chatapplication D/issueTracker_: 3
2021-12-02 11:19:29.333 14569-14569/com.example.chatapplication D/issueTracker_: 3
2021-12-02 11:19:29.348 14569-14569/com.example.chatapplication D/issueTracker_: 3
2021-12-02 11:19:29.364 14569-14569/com.example.chatapplication D/issueTracker_: 3
2021-12-02 11:19:29.427 14569-14569/com.example.chatapplication D/issueTracker_: 3
现在,如果我调用cancel()
,它将取消流程,但在向数据库添加新条目时不会再次运行。
我该如何解决这个问题??
在collect
块的末尾,您两次更新消息数据库。 这会导致流两次发出更新的消息列表。 它导致无限的更新收集循环。
将distinctUntilChanged function 应用于流,以过滤掉包含相同顺序的相同项目的连续消息列表。 还将自定义谓词作为参数传递,以定义哪些消息应被视为相同。
例如,如果您想跳过收集包含相同 ID 集合的消息列表:
val idEquality = { oldMessages: List<Message>, newMessages: List<Message> ->
oldMessages.map(Message::id) == newMessages.map(Message::id)
}
dao!!.getSingleUsersMessages(roomId = roomId!!, alternateRoomId = roomId2!!)
.distinctUntilChanged(idEquality)
.collect { messages ->
我找到了一个可以投入大量时间的解决方案。
解决方案:我们向房间数据库中插入详细信息并从数据库中获取信息时,应使用相同的 Dao Object。
如果你使用的是匕首柄那么
@Singleton 注释将起作用。
我希望这会解决你的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.