我一直在阅读this教程,以了解Paho android Service API
的基础知识,以及我在client.connect(context, callback
中阅读的一些内容,其中有两个方法onSuccess()
和{ {1}}
如上所述,在此示例中使用了同步客户端(MqttClient而不是MqttAsyncClient)。这意味着请求(如connect)将阻止并返回或抛出异常。没有轮询或读取方法来从服务器获取消息,来自服务器的消息可以随时到达。该库提供了一种回调机制来处理这种行为,将在适当的时候调用在客户端注册的MqttCallback对象中的方法。 MqttCallback是一个必须由另一个类实现的接口...为了启用回调功能,向客户端注册了一个回调对象,这在逻辑上可以在连接到服务器之前完成
在阅读了我提到的最后两行后,我感到困惑。因为据我所知,让客户端注册到具有onFailure()
的calback的本质是处理服务器状态“异步”并从服务器读取。
现在,我的问题是,关于我引用的最后两行,如何在连接到服务器之前注册客户端以从服务器读取状态?或换句话说,“为什么”,client.callback“应该在”client.connect()“之前调用?”
任何人都可以澄清并解释这一点。
答案 0 :(得分:1)
设置回调时,您所做的就是注册收到新邮件时调用哪个函数。在连接到MQTT代理之前,实际上什么也没发生。您应该在连接之前设置回调,这样您就不会错过任何消息。
例如,如果cleansession == 0,MQTT代理将在您连接时立即恢复上一个会话。如果有消息等着你而你还没有设置你的回调功能,你可能会错过这些消息。
即使cleansession == 1,连接后的下一个命令也可能是MQTTClient_subscribe。出于类似的时序原因,您应该在调用MQTTClient_subscribe之前设置回调。所以当你知道cleansession ==时,它是callback-connect-subscribe或connect-callback-subscribe。没有太大区别,所以你可能习惯在连接之前设置回调函数
答案 1 :(得分:0)
...要启用回调功能,会向客户端注册回调对象,这在连接到服务器之前最合乎逻辑地完成
这几乎意味着MqttClient.setCallback()应该在连接之前被调用,但不需要发生以使其工作;我没有测试过这个,但这是我从那个陈述中得到的。
我认为会发生的是客户端将连接(或不连接),您的应用程序将无法知道结果,因为该决定是通过回调来实现的。希望这有帮助!