订阅多个 MQTT 主题

Subscribe to Multiple MQTT topics

我遇到了一个问题,或者可能是因为我的编程背景不多,问题是关于订阅多个主题并在 android

中的多个文本视图中显示订阅的主题

我以前是这样订阅的:

private void setSub()
{
    try{

        client.subscribe(topic,0);

    }
    catch (MqttException e){
        e.printStackTrace();
    }
}

然后我在成功连接到 MQTT 客户端后调用了 setsub() 函数

然后我实现了 setCallBack 方法,并在 messageArrived 下添加了一行,以使用从订阅

收到的消息负载更改 textview 值
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
    temp.setText(new String(message.getPayload()));
}

当然,当我定义另一个 textview 时,它得到的结果与第一个相同

所以我的问题是如何配置 MessageArrived 函数以在单个文本视图中显示每个主题?

提前谢谢你。

我刚刚弄明白了,

if (topic.contains("button") ) {
            temp.setText(new String(message.getPayload()));
        }
        else if (topic.contains("test"))
        {
            volt.setText(new String(message.getPayload()));
        }

我刚刚输入了我想显示的每个主题的名称。

您可以根据需要针对不同的主题多次调用 client.subscribe()

private void setSub()
{
    try{

        client.subscribe(topic1,0);
        client.subscribe(topic2,0);
        client.subscribe(topic3,0);

    }
    catch (MqttException e){
        e.printStackTrace();
    }
}

messageArrived() 回调被传递给每条消息的 topic,因此您只需设置一个 if 语句来决定根据主题更新哪个 textView。

@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
  if (topic.equals(topic1) {
    temp.setText(new String(message.getPayload()));
  } else if (topic.equals(topic2) {
    foo.setText(new String(message.getPayload()));
  }
}

但是您不应该在回调中调用 setText() 方法,因为它发生在客户端线程上。您需要查看使用 runOnUiThread() 进行更新。

尝试 runOnUiThread 方法,因为 onMessageArived() 是一个客户端线程。

public void messageArrived(String topic, MqttMessage message) 
throws Exception {
    String msg = new String(message.getPayload());
    Log.i(TAG, "Message Arrived: " + msg);
    runOnUiThread(new Runnable(){
        public void run() {
            textView.setText(msg);
        }
    });
}