我正在使用Java开发和Android应用程序,一旦我在messageArrived
回调上收到一些消息,我正在尝试订阅一个新主题,但订阅方法没有返回。客户端已连接。
我正在使用同步(阻塞)MqttClient版本。
我试图断开连接并再次连接,但我得到“不允许从回调方法断开连接”,所以我猜这与订阅方法类似。
所以问题是,如何在messageArrived
事件上订阅另一个主题?或者,我如何重新连接messageArrived
事件?
答案 0 :(得分:0)
这可能是您正在使用的API特有的,但一般情况下,如果您从IO线程进行阻塞调用,则会阻塞通常会收到用于解除阻塞调用线程的响应的线程。
说明:
假设您有两个主题:
线程1:应用程序线程。
线程2:IO线程。
---行动
线程1:connect()(阻塞)
线程2:接收CONNACK(解除阻塞线程1)
主题1:订阅(“topic1”)(阻止)
线程2:接收SUBACK(解除阻塞线程1)
线程2:接收消息(在您的情况下触发阻止订阅)
由于线程2被阻塞等待SUBACK数据包,因此无法读取 从套接字接收SUBACK数据包。
我可以想到两个解决方案:
1)使用来自IO线程的非阻塞订阅(并处理异步确认)
2)调度阻止subscribe()到另一个线程。