启用 IQProvider 时,Smack 无法识别 type="result" 节
Posted
技术标签:
【中文标题】启用 IQProvider 时,Smack 无法识别 type="result" 节【英文标题】:Smack doesn't recognize type="result" stanza when IQProvider is enabled 【发布时间】:2016-04-09 09:51:07 【问题描述】:tl;dr
注册 IQProvider 时,我在 StanzaListener
中没有得到答案,我可能没有准确理解 IQProviders 的工作原理,但不知道从哪里开始。
我正在使用 Smack 发送和接收一些自定义 IQ。这是我用来发送自定义 IQ 的代码。
iq.setFrom(JidCreate.fullFrom(CLIENT_USER));
iq.setTo(JidCreate.fullFrom(SERVER_USER));
xmppConnection.sendIqWithResponseCallback(iq, new StanzaListener()
@Override
public void processPacket(Stanza packet) throws SmackException.NotConnectedException, InterruptedException
handleReply((WedooIQ) packet);
, new ExceptionCallback()
@Override
public void processException(Exception exception)
exception.printStackTrace();
);
好的。我确定发送了正确的答案,因为调试模式向我展示了我想看到的内容。结果节由另一端的节点客户端提供,所以这个问题不关心。
这对我来说不起作用:我在StanzaListener()
中得到了答案,但当然,如果我不想这样做,我也无能为力我自己的所有解析。我被告知要实现一个 IQProvider 并注册它 - 所以我这样做了:
ProviderManager.addIQProvider(Xxx.ELEMENT_NAME, Yyy.NAMESPACE, new ZzzIQProvider());
但是当它被注册时,我不再得到答案,而是在那 5 秒后出现超时异常
System.err: org.jivesoftware.smack.SmackException$NoResponseException: No response received within reply timeout. Timeout was 5000ms (~5s). Waited for response using: IQReplyFilter ......
我认为IQProvider
会成功,这样我就可以从上面的StanzaListener
中获得更有用的对象。这是如何运作的?我已经阅读了smack homepage 上的相关文档,但我不明白如何接收 IQ,我只了解如何注册提供者,对我没有任何明显影响。
可能只是在这里遗漏了一些小东西,非常感谢任何帮助,因为我已经坐了几天了。
【问题讨论】:
你同时发送多个 IQ/stanza 吗?? 抱歉,一秒忘记回答我的问题 我遇到了同样的问题,我在我的 IQProvider 上发现了一个错误。 IQProvider 返回具有不同节 id 的 IQ,因此 StanzaListener 不会使用 StanzaFilter 捕获结果 IQ..... 【参考方案1】:我的解析器出现错误,我没有读完所有标签。所以它会在没有任何通知的情况下默默地失败。确保您正确读取整个 XML,同时在上课前不要滥用解析器或解析器
如果不是这样,这是来自 cmets 中 @calvinfly 的另一个想法:
我面临同样的问题,我在我的 IQProvider 上发现了一个错误。 IQProvider 返回具有不同节 id 的 IQ,因此 StanzaListener 不会使用 StanzaFilter 捕获结果 IQ.....
【讨论】:
以上是关于启用 IQProvider 时,Smack 无法识别 type="result" 节的主要内容,如果未能解决你的问题,请参考以下文章
asmak 数据包侦听器和自定义 IQProvider 未触发/调用
将 PrivateDataManager 与 (a)Smack 一起使用时,无法获取所有 BookMarkedRooms。总是只返回最后一个书签
ClassCastException: org.jivesoftware.smack.PacketReader$4 在传输文件时无法转换为 org.jivesoftware.smackx.packet