繁体   English   中英

Kotlin Coroutine Flow 与房间数据库循环运行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM