MQTT订阅messageArrived

时间:2015-03-06 13:10:14

标签: android mqtt

我正在使用Java开发和Android应用程序,一旦我在messageArrived回调上收到一些消息,我正在尝试订阅一个新主题,但订阅方法没有返回。客户端已连接。

我正在使用同步(阻塞)MqttClient版本。

我试图断开连接并再次连接,但我得到“不允许从回调方法断开连接”,所以我猜这与订阅方法类似。

所以问题是,如何在messageArrived事件上订阅另一个主题?或者,我如何重新连接messageArrived事件?

1 个答案:

答案 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()到另一个线程。