【问题标题】:MQTT subscribe on messageArrivedMQTT 订阅 messageArrived
【发布时间】:2015-03-06 13:10:13
【问题描述】:

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

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

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

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

【问题讨论】:

  • 请添加您的代码
  • 你能发布一些示例代码吗?此外,您真的不应该在回调线程上进行网络 IO,最好将其交给由线程池处理的单独队列。

标签: android mqtt


【解决方案1】:

这可能特定于您正在使用的 API,但一般来说,如果您从 IO 线程进行阻塞调用,您将阻塞通常会接收用于解除阻塞调用线程的响应的线程。

解释:

假设你有两个线程:

线程 1:应用程序线程。

线程 2:IO 线程。

--- 动作

线程 1:connect()(阻塞)

线程 2:接收 CONNACK(解除阻塞线程 1)

线程 1:subscribe("topic1")(阻塞)

线程 2:接收 SUBACK(解除阻塞线程 1)

线程 2:接收消息(在您的情况下触发阻塞订阅)

由于线程 2 被阻塞等待一个 SUBACK 数据包,它无法读取 从套接字接收 SUBACK 数据包。

我能想到两种解决方案:

1) 使用来自 IO 线程的非阻塞订阅(并处理异步确认)

2) 将阻塞 subscribe() 分派到不同的线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-10
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    相关资源
    最近更新 更多