我正在苦苦挣扎,或者可能是因为我的编程背景很小,所以问题在于订阅多个主题并在android的多个textview中显示订阅的主题
我曾经这样订阅它:
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函数以在单个textview中显示每个主题?
谢谢。
答案 0 :(得分:1)
您可以根据需要根据不同的主题多次致电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()
进行更新。
答案 1 :(得分:0)
我已经弄清楚了,
if (topic.contains("button") ) {
temp.setText(new String(message.getPayload()));
}
else if (topic.contains("test"))
{
volt.setText(new String(message.getPayload()));
}
我刚刚输入了要显示的每个主题的名称。