簡體   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