如何显示消息的实时进度?使用什么数据structure/view?

How to display live progress of a message? What data structure/view to use?

我有一项工作服务允许用户通过以太网发送电子邮件。此服务是一个更大的应用程序的一部分,该应用程序允许用户在传输时查看这些消息(发送和接收)的进度。

我的服务负责通过回调接口通知消息队列何时更改(添加或删除消息)以及何时发生消息更新(消息的进度或状态已更改,例如, 50% -> 75%,"receiving" -> "decoding")。当队列改变时,这个接口传入一个队列中的消息列表now/still,大致是这样的:

public void MessageQueueChanged(final MessageProps[] queueMsgs) {
     if (queueMsgs.length != 0) {
        for (MessageProps msg : queueMsgs) {
            //Iterate through each message and 
              store it in a data structure//
        }
     }
}

并且当服务报告发生消息更新时,数据结构也应该更新:

public void MessageChanged(MessageProps msg) {
    //if msg is in msg queue/data structure
    //update in data structure
}

每个消息都有一个唯一的 guid 来标识它,最好是用于存储此消息队列的数据结构处理通知 UI 它已更改以便重绘。一旦消息离开队列,我就不需要关心它;我只想 "know" 在我应该显示它的持续时间内,即在发送或接收它时。

我的问题的核心是:我有哪些选项来存储和显示这种瞬时消息进度?消息可能会非常快速地多次更新(毫秒级),但消息生命周期就是传输所需的时间。

我最初尝试将简单的 ArrayList<> 与 RecyclerView 一起使用,并使用单独的 Hashmap 来跟踪实时消息 guid,但我 运行 导致一些内部 RecyclerView 崩溃,类似于此问题:RecyclerView: Inconsistency detected. Invalid item position

我正在考虑使用 ContentProvider 来存储每条消息,因为有一些其他功能可以干净地利用它,并使用常规的旧 ListView 作为我的显示。但这让我想知道如何跟踪哪些消息是 'live' - 如果没有实时 guid 的 Hashmap,我不确定向内容提供者查询实时消息的最有效方法。尽管保留该哈希图似乎是错误的。我还想过,一旦我处理完这些消息,就可以从内容提供者那里删除消息,但不确定这样做是否有效或安全;在安全的情况下删除整个 table,或者逐行删除。

感谢您阅读到这里,我希望我问的很清楚。我很乐意澄清或扩展任何事情;我不想过于具体,所以我希望我抓住了问题的核心。

最后我决定使用 ContentProvider 来存储和更新收到的消息信息;一个 SimpleCursorAdapter 来处理相关消息的显示和加载;和一个字符串类型的 ArrayList,用于通过 guid 跟踪主动更新的消息。

我发现 SimpleCursorAdapter 足以显示这种类型的简单数据,而且足够稳定以处理所需的大量重绘。

如果有人寻求类似的解决方案,我很乐意扩展我的 answer/share 相关代码细节。