我正在努力解决一个问题,或者可能是因为我的编程背景很小,问题是关于订阅多个主题并在 android 的多个文本视图中显示订阅的主题。
我曾经这样订阅它:
private void setSub(){
try{
client.subscribe(topic,0);
}
catch (MqttException e){
e.printStackTrace();
}
}
那么我在成功连接到 MQTT 客户端后调用了 setsub()函数
然后我已经实现了setCallBack方法,并在messageArrive下添加了该行,以使用我从订阅收到的消息有效负载更改文本视图值。
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
temp.setText(new String(message.getPayload()));
}
当然,当我定义另一个文本视图时,它只是采用了与第一个相同的结果。
所以我的问题是如何配置 MessageArrives 函数以在单个文本视图中显示每个主题?
提前谢谢你。
回答1:
您可以根据需要多次调用不同的主题。client.subscribe()
private void setSub(){
try{
client.subscribe(topic1,0);
client.subscribe(topic2,0);
client.subscribe(topic3,0);
}
catch (MqttException e){
e.printStackTrace();
}
}
回调是针对每条消息传递的,因此您只需设置 if 语句即可根据主题决定要更新的 textView。messageArrived()
topic
@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()
回答2:
我刚刚想通了
if (topic.contains("button") ) {
temp.setText(new String(message.getPayload()));
}
else if (topic.contains("test"))
{
volt.setText(new String(message.getPayload()));
}
我刚刚输入了要显示的每个主题的名称。
回答3:
尝试运行OnUiThread方法,因为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);
}
});
}