通过 DatagramSocket 持续发送发送者数据

Continuously send sendor data via DatagramSocket

我正在尝试实现一个应用程序,它将通过 UDP 协议将数据从移动设备加速计持续发送到 PC。

所以,此刻我意识到要从设备加速度计接收数据,我需要创建一个新的 SensorEventListener 并覆盖 onSensorChanged() 方法,并处理来自 [=15] 的传感器数据=] 变量,像这样:

private class AccelerationListener implements SensorEventListener {

    @Override
    public void onSensorChanged(SensorEvent event) {
        //handle event data here
    }
}

这对我来说很清楚了。

为了通过 DatagramSocket 发送消息,我创建了一个新的 Runnable:

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());
        }
    }
}

然后在 onSensorChanged() 方法中调用此 Runnable,如下所示:

    @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 垃圾邮件.恐怕这会严重影响应用程序的性能,想知道是否有其他方法可以处理线程,但继续连续发送数据?

  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. 使用线程池,这样你就只有一个线程:

    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());
    }