2015-03-06 14 views
1

Я разрабатываю Android-приложение на Java, и я пытаюсь подписаться на новую тему, как только получаю сообщение о обратном вызове messageArrived, но метод подписки не возвращается. Клиент подключен.MQTT подписаться на сообщениеArrived

Я использую синхронную (блокирующую) версию MqttClient.

Я попытался отключить и снова подключиться, но я получаю «Отключение не допускается из метода обратного вызова», поэтому я предполагаю, что с помощью метода подписки это похоже.

Итак, вопрос в том, как я могу подписаться на другую тему на мероприятии messageArrived? Или, как я могу подключиться к событию messageArrived?

+0

Добавьте свой код – Marcus

+0

Можете ли вы разместить пример кода? Также вы действительно не должны делать сетевое IO в потоке обратного вызова, лучше передать его в отдельную очередь, обработанную пулом потоков. – hardillb

ответ

0

Это, вероятно, относится к API, который вы используете, но в целом, если вы делаете блокирующий вызов из потока ввода-вывода, вы блокируете поток, который обычно получает ответ, используемый для разблокирования вызывающего потока.

Объяснение:

Допустим, у вас есть две темы:

темы 1: поток приложения.

Резьба 2: резьба IO.

--- Действия

тема 1: подключение() (блокирующие)

тема 2: Получение CONNACK (разблокируют поток 1)

тема 1: подписаться ("topic1") (блокировка)

тема 2: Получение SUBACK (разблокирует нить 1)

тема 2: Получите сообщение (в вашем случае вызывает блокировку подписки)

Поскольку поток 2 заблокирован в ожидании пакета SUBACK, он не может прочитать из сокета для получения пакета SUBACK.

Я могу думать о двух решениях:

1) Используйте нелипкий подписываться из потока ввода-вывода (и обработка асинхронного подтверждения)

2) отправка блокировка подписываются() для другого потока ,

Смежные вопросы