KotlinCoroutine Flow与房间数据库在回路中运行

cotxawn7  于 2023-01-31  发布在  Kotlin
关注(0)|答案(2)|浏览(123)

我正在构建一个聊天应用程序,并使用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(),它会取消流,但在向数据库添加新条目时不会再次运行。
如何解决此问题?

mrphzbgm

mrphzbgm1#

collect块的末尾,您两次更新消息数据库。这导致流两次发出更新的消息列表。这导致无限的更新-收集循环。
distinctUntilChanged函数应用于流,以筛选出包含相同项且顺序相同的连续消息列表。还要将自定义 predicate 作为参数传递,以定义应将哪些消息视为相同。
例如,如果要跳过收集包含相同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 ->
mqxuamgl

mqxuamgl2#

我已经找到了解决投入这么多时间的办法。
解决方案:当我们将详细信息插入房间数据库并从DB中获取信息时,应该使用相同的Dao对象。
如果你用的是剑柄
@Singleton注解将起作用。
我希望这能解决你的问题。

相关问题