安卓(XMPP)聊天应用中的消息缓存/同步

9

问题描述

我正在创建基于XMPP协议的Android聊天应用程序。在应用程序中,使用Smack作为XMPP客户端库,并将消息存储在SQLite数据库中。

问题

如何实现消息缓存(例如Facebook Messenger中所做的)?如果服务器上有新消息,则下载20条并显示给用户;如果没有,则从本地数据库中显示。如果用户再次向上滚动,则检查数据库和服务器,并显示下一批20条消息。

是否有开源示例可用?


通常,当缓存数据可以在服务器上更新时,客户端需要维护一个偏移量(计数器/时间戳或类似的内容)。这些文章解释了数据同步模式,您可以使用它们来针对您的用例设计协议: https://dev59.com/nWgv5IYBdhLWcg3wI9Sg https://dev59.com/Rmgu5IYBdhLWcg3we2-t - NewestStackOverflowUser
我做过同样的项目,但使用了SignalR作为通信方式。在第一次登录时,我下载最新的消息数据(在我的情况下是最近3天的消息),并将其存储在本地SQLite数据库中,然后在视图中反映出来。如果您向下滚动,我会使用REST API下载更多的块数据。对于实时消息传递,首先将消息存储在本地,然后再在视图中显示。 - Dee Nix
1个回答

0

使用SQLiteXMPP MAM扩展的组合。


  1. 将新消息存储在数据库中。
  2. 从本地数据库加载并显示最后 x 条消息。
  3. XMPP MAM 扩展将从服务器获取信息,包括过去和现在的消息,即使它们不在客户端的内存中。
  4. 当用户想要查看更多消息时,请检查数据库和服务器。
  5. 使用缓存逐出策略从数据库中重置/删除过去的消息,以避免内存使用。

使用XMPP MAM扩展程序检索最近的20条消息:

int n = 20; // The number of messages to retrieve
MamManager mamManager = MamManager.getInstanceFor(connection);
MamQueryResult mamQueryResult = mamManager.queryArchive(n);
List<Forwarded> forwardedList = mamQueryResult.getForwardedMessages();
for (Forwarded forwarded : forwardedList) {
    Stanza stanza = forwarded.getForwardedStanza();
    if (stanza instanceof Message) {
        Message message = (Message) stanza;
        // Display the message to the user or process it as needed
    }
}

connection 表示 XMPPn 变量表示消息数量,mamManager.queryArchive(n)MAM 检索最后的 n 条消息。

if (stanza instanceof Messages) 检查 Message 数据包,因为 MAM 可以像 Presence 一样检索它。


请参阅XEP-0313以获取更多信息。 开源示例可以作为检查的好材料,例如Smack, SQLitePix-Art Messanger


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接