订阅多个 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);
}
});
}
我遇到了一个问题,或者可能是因为我的编程背景不多,问题是关于订阅多个主题并在 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);
}
});
}