我正在编写一个Android应用程序(API 24),该应用程序应该通过 UDP 连接接收遥测消息。只要(无线)连接处于良好状态,它就可以正常工作,只要它会使 UDP 接收器降级,并且即使连接再次处于良好状态,我也无法重生。< / p>
这是我的代码:
private class UDPReceiver extends Thread {
private boolean keepRunning = true;
private int UDP_SERVER_PORT;
public Queue<String> messagesQueue = new LinkedList<>();
public void run() {
byte[] buffer = new byte[MAX_UDP_DATAGRAM_LEN];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
DatagramSocket socket = null;
do {
try {
socket = new DatagramSocket(UDP_SERVER_PORT);
socket.setReuseAddress(true);
while (keepRunning) {
socket.receive(packet);
messagesQueue.add(new String(buffer, 0, packet.getLength()));
runOnUiThread(updateTelemetry);
}
} catch (Throwable e) {
Log.e(this.getClass().getName(), e.getMessage());
e.printStackTrace();
}
try {
Thread.sleep(UDP_SERVER_RESPAWN);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (keepRunning);
if (socket != null) {
socket.close();
}
}
private Runnable updateTelemetry = new Runnable() {
public void run() {
if (gcsUDPReceiver == null) return;
final String message = gcsUDPReceiver.messagesQueue.poll();
if (message == null) return;
telemetryTask(message);
}
};
我认为do...while
中的外部UDPReceiver
循环应该可以解决重新生成死连接的问题,但这不能按我预期的那样工作,而且setReuseAddress(true)
指令似乎是问题的根源而不是部分修复。
我可能正在执行其他一些错误,但我无法捕获它。