启用 IQProvider 后,Smack 无法识别 type="result" 节

Smack doesn't recognize type="result" stanza when IQProvider is enabled

tl;dr

在注册 IQProvider 时,我在 StanzaListener 中没有得到答案,我可能没有准确理解 IQProvider 的工作原理,但不知道从哪里开始。


我正在使用 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,我只知道如何注册一个提供者,对我没有任何可见的影响。


可能只是遗漏了一些小东西,非常感谢任何帮助,因为我已经坐了好几天了。

我的解析器出错,我没有读完所有标签。所以它会在没有任何通知的情况下默默地失败。确保您正确阅读整个 XML,同时在 class

之前不要滥用解析器或解析器

如果不是这样,评论中@calvinfly 的另一个想法:

I am facing same problem, and I found a bug on my IQProvider. IQProvider returns IQ with different stanza id, so StanzaListener wouldn't capture the result IQ with StanzaFilter.....