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

标签 android multithreading sockets networking android-sensors

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

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

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

关于android - 通过 DatagramSocket 持续发送发送者数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37595119/

相关文章:

android - Genymotion 不显示所有 API 版本

android - 发送内容不可编辑的电子邮件

sql - 如何在多线程应用程序中获取 DB2 序列值

c++ - 用于游戏(和其他任务)的简单而有效的 UDP 服务器策略

python - 发送和接收如何在 Python 套接字中工作?

Python套接字绑定(bind)到任何IP?

Android 应用无法在 2.2 上加载 native 库代码

android - AndroidKeyStore什么时候在AndroidKeyStore中存储私钥和公​​钥?

java - 将所有接口(interface)实例注册到某个全局容器

c++ - 在接收问题上阻塞套接字超时