我正在开发一个使用 MAVLINK 协议进行通信的应用程序。我为此目的使用dronefleet 。我的应用程序有一个服务,它运行ReadThread
检查传入的MAVLINK 消息的类型。ReadThread
然后向 UI 发送消息以更新一些TextViews
无人机的信息,如电池状态等。这是我的代码。
ReadThread
在DService.java中
import io.dronefleet.mavlink.MavlinkMessage;
import io.dronefleet.mavlink.common.Attitude;
import io.dronefleet.mavlink.common.SysStatus;
public static final int ATTITUDE = 1;
public static final int SYS_STATUS = 2;
private class ReadThread extends Thread {
private AtomicBoolean keep = new AtomicBoolean(true);
@Override
public void run() {
while(keep.get()){
if(inputStream == null)
return;
MavlinkMessage message;
try {
---------------------get MAVLINK message from stream here---------------
message = mavlinkConnection.next();
-------------------check MAVLINK message type and then send message to UI for updating related fields--------------------
if(message.getPayload() instanceof Attitude) {
MavlinkMessage<Attitude> attitudeMessage = (MavlinkMessage<Attitude>)message;
myHandler.obtainMessage(ATTITUDE, attitudeMessage).sendToTarget();
}
----------------removing comments causes app to crash---------------------
/*if(message.getPayload() instanceof SysStatus) {
MavlinkMessage<SysStatus> sysStatusMessage = (MavlinkMessage<SysStatus>)message;
int battery = sysStatusMessage.getPayload().batteryRemaining();
myHandler.obtainMessage(SYS_STATUS, Integer.toString(battery)).sendToTarget();*/
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void setKeep(boolean keep) {
this.keep.set(keep);
}
}
handleMessage()
在MainActivity.java
switch (msg.what) {
case DService.SYS_STATUS:
String battery = (String) msg.obj + "%";
myActivity.get().batteryView.setText(battery);
case DService.ATTITUDE:
MavlinkMessage<Attitude> message = (MavlinkMessage<Attitude>) msg.obj;
String pitch = Float.toString(message.getPayload().pitch());
String roll = Float.toString(message.getPayload().roll());
String yaw = Float.toString(message.getPayload().yaw());
myActivity.get().pitchView.setText(pitch);
myActivity.get().rollView.setText(roll);
myActivity.get().yawView.setText(yaw);
break;
}
}
我的问题是,如果我在我的ReadThread
. 如果我检查(比如说)SYS_STATUS
或ATTITUDE
,那么 UI 中的相应TextViews
s 每秒都会无缝更新(这是 MAVLINK 发送消息的速率)。但不适用于 2 个消息类。如果我从一个if
区块中删除评论,我的应用程序就会崩溃。
可能是什么原因?我handleMessage()
错了吗?我需要使用MessageQueue
或其他一些android机制吗?我应该ReadThread
为每个 MAVLINK 消息类型运行单独的线程吗?
我正在 Ubuntu 18 上开发,并使用 Android Studio。