1

Я пытаюсь внедрить приложение, которое будет непрерывно отправлять данные с мобильного устройства 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 спама. Я боюсь, что это может сильно повлиять на производительность приложения и интересно, есть ли другой способ борьбы с потоками, но продолжать отправлять данные непрерывно?

+0

Ваш догадка правильна. Создание потока для каждой отправляемой датаграммы не является жизнеспособным решением. Вам нужно либо использовать пулы потоков, либо (лучший подход в моем представлении) создать выделенный поток, который будет подписываться на показания датчика и отправлять данные из одного и того же обратного вызова уведомления. – SergeyA

ответ

1
  1. Самый простой способ сделать управлять большим количеством потоков, чтобы избавиться от создания потоков все вместе и отправить датчик считывает синхронно:

    public void onSensorChanged(SensorEvent event) { 
        String message = event.timestamp + " " 
          + event.values[0] + " " 
          + event.values[1] + " " 
          + event.values[2]; 
        (new UDPSend(message.getBytes())).run(); 
    } 
    
  2. Используйте ThreadPool, таким образом, вы будете иметь только одна нить:

    class Sender { 
    
        final ExecutorService pool = Executors.newSingleThreadExecutor(); 
    
        public void send(byte[] bytes) { 
         pool.submit(new UDPSend(bytes); 
        } 
    } 
    
    
    public void onSensorChanged(SensorEvent event) { 
         String message = event.timestamp + " " 
           + event.values[0] + " " 
           + event.values[1] + " " 
           + event.values[2]; 
         sender.send(message.getBytes()); 
    } 
    

 Смежные вопросы

  • Нет связанных вопросов^_^