我有一个使用websockets的聊天应用程序。
通过websocket我收到消息,我将其保存到对话表中的db,messages表和更新last message id
。现在,两个保存都将通知光标。所以我打电话给updateDate
两次。它们将以正确的顺序和正确的线程顺序运行。然而,我猜,动画是重叠的,并且在youtube video attached中可以看到奇怪的效果(从消息" i"中可见)。任何人都可以查明我的问题或给我解决方案吗?
我使用rxjava进行线程化和出列以进行堆叠更新,同时始终只从dequeue获取最后一次更新。来自vlc的灵感here
RecyclerView从末端堆叠,如果用户滚动到底部,则在新消息到来时运行动画滚动到底部。
片段
adapter = ChatMessageAdapter()
recycler.apply {
adapter = this@ChatDetailFragment.adapter
layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false).apply { stackFromEnd = true }
}
ChatMessageAdapter
private val pendingUpdates: ArrayDeque<Single<Pair<MutableList<ChatItemHolder>, DiffUtil.DiffResult>>> = ArrayDeque()
@MainThread
fun updateData(msgs: MutableList<ChatMessage>, onDone: () -> Unit) {
pendingUpdates.add(
internalUpdate(msgs)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.doOnSuccess {
items.clear()
items.addAll(it.first)
it.second.dispatchUpdatesTo(this@ChatMessageAdapter)
onDone()
}
)
if (pendingUpdates.size == 1) pendingUpdates.peek().subscribe(Consumer {processQueue()})
}
private fun internalUpdate(msgs: MutableList<ChatMessage>) = Single.create<Pair<MutableList<ChatItemHolder>, DiffUtil.DiffResult>> {
val newItems = temp(msgs) // transforming function from ChatMessage[] to ChatItemHolder[]
val result = DiffUtil.calculateDiff(DiffUtilCallback(newItems, items), true)
it.onSuccess(Pair(newItems, result))
}
@MainThread
private fun processQueue() {
pendingUpdates.remove()
if (!pendingUpdates.isEmpty()) {
if (pendingUpdates.size > 1) {
val last = pendingUpdates.peekLast()
pendingUpdates.clear()
pendingUpdates.add(last)
}
pendingUpdates.peek().subscribe(Consumer { processQueue() })
}
}
谢谢!