Я пишу приложение для Android (API 24), которое должно получать телеметрические сообщения через UDP соединение. Он работает нормально, если (беспроводное) соединение находится в хорошем состоянии, если оно ухудшает работу приемника UDP , и я не могу возродиться, даже если соединение снова находится в хорошем состоянии.
Это мой код:
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)
кажется источником проблем, а не частичным исправлением.
Возможно, я совершаю какую-то другую ошибку, но не могу ее перехватить.