【发布时间】:2018-08-16 02:09:08
【问题描述】:
一旦我有了名册,我就可以遍历所有成员并使用 MamManager 进行查询
mamManager.mostRecentPage(jid, QUERY_META_DATA_PAGE_SIZE)
但是,这只能让我一次获取一个 jid 的数据,这意味着如果用户有 1000 个连接,我必须进行 1000 个网络调用。有什么方法可以获取多个 jids 的最新消息?
编辑
所以我已经从 smack 的 4.2.3 更新到 4.3 以获得最新的 api,我仍然可以找到一种方法来执行我想要的查询,而无需遍历 jids
for (int i = 0; i < jidList.size(); i++) {
MamQueryArgs mamQueryArgs = MamQueryArgs.builder()
.setResultPageSize(1)
.limitResultsToJid(jidList.get(i))
.queryLastPage().build();
MamQuery mamQuery = mamManager.queryArchive(mamQueryArgs);
}
所以在新用户第一次登录时,我会访问服务器 1000 次
编辑 2
实际上,对于第一次登录,上面的查询没有返回任何内容,可能是因为本地存档为空,所以我必须执行以下操作:
for (Jid : jidList) {
MamQuery mamQuery = mamManager.queryMostRecentPage(jid, 1);
}
【问题讨论】:
-
使用“1”的结果页面大小似乎是一个糟糕的主意。我建议使用更大的尺寸,例如 10。
-
是的,当用户从聊天列表进入聊天时,我可以缓冲更多,但这不是真正的问题,问题是它对服务器进行的 1000 次查询最多需要 10 分钟同步
-
我不确定您到底想实现什么,但通常客户端只是同步本地用户存档,如果操作正确,这是一个单一的查询。
-
那会是什么查询?我正在尝试构建一个聊天连接屏幕,显示完整的花名册,以及发送的最后一条消息的文本,基本上就像 whatsapp,但这些花名册可能很大,p95 是花名册中大约 1000 个连接,每个聊天有 65 个聊天很旧,几个月没用过
-
可能是在位于存档本地副本之上的消息 ID 之后的查询。然后翻页,直到您到达存档的末尾(即最近的消息)。