我正在构建一个聊天应用程序,并使用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()
}
我的刀查询:
@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()
,它会取消流,但在向数据库添加新条目时不会再次运行。
如何解决此问题?
2条答案
按热度按时间mrphzbgm1#
在
collect
块的末尾,您两次更新消息数据库。这导致流两次发出更新的消息列表。这导致无限的更新-收集循环。将distinctUntilChanged函数应用于流,以筛选出包含相同项且顺序相同的连续消息列表。还要将自定义 predicate 作为参数传递,以定义应将哪些消息视为相同。
例如,如果要跳过收集包含相同ID集合的邮件列表:
mqxuamgl2#
我已经找到了解决投入这么多时间的办法。
解决方案:当我们将详细信息插入房间数据库并从DB中获取信息时,应该使用相同的Dao对象。
如果你用的是剑柄
@Singleton注解将起作用。
我希望这能解决你的问题。