Я пытаюсь внедрить приложение, которое будет непрерывно отправлять данные с мобильного устройства Accelerometer на ПК через протокол UDP.Постоянно отправлять данные отправителя через DatagramSocket
Таким образом, в этот момент я понял, что для получения данных от акселерометра устройства нужно создать новый SensorEventListener
и переопределить onSensorChanged()
метод и и обрабатывать данные датчика от переменной event
, как это:
private class AccelerationListener implements SensorEventListener {
@Override
public void onSensorChanged(SensorEvent event) {
//handle event data here
}
}
Это довольно ясно для меня.
Чтобы отправить сообщение, я создал новый Runnable через DatagramSocket:
private class UDPSend implements Runnable {
private byte[] message;
UDPSend(byte[] message) {
this.message = message;
}
@Override
public void run() {
try {
datagramSocket = new DatagramSocket();
InetAddress receiverAddress = InetAddress.getByName(SERVER_IP);
DatagramPacket packet = new DatagramPacket(
message,
message.length,
receiverAddress,
SERVER_PORT
);
datagramSocket.send(packet);
} catch (IOException e) {
Log.e(TAG, e.toString());
}
}
}
И затем вызвать эту Runnable
в onSensorChanged()
способом, как это:
@Override
public void onSensorChanged(SensorEvent event) {
String message = event.timestamp + " "
+ event.values[0] + " "
+ event.values[1] + " "
+ event.values[2];
new Thread(new UDPSend(message.getBytes())).start();
}
Это работает просто отлично, и мой udp-сервер успешно получает данные датчиков.
Итак, мой вопрос - в связи с тем, что я установил SensorManager.SENSOR_DELAY_FASTEST
как скорость обновления для моего SensorEventListener
, он создает тысячи потоков для обработки этого SensorEvent
спама. Я боюсь, что это может сильно повлиять на производительность приложения и интересно, есть ли другой способ борьбы с потоками, но продолжать отправлять данные непрерывно?
Ваш догадка правильна. Создание потока для каждой отправляемой датаграммы не является жизнеспособным решением. Вам нужно либо использовать пулы потоков, либо (лучший подход в моем представлении) создать выделенный поток, который будет подписываться на показания датчика и отправлять данные из одного и того же обратного вызова уведомления. – SergeyA