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