通过DatagramSocket

时间:2016-06-02 14:45:45

标签: android multithreading sockets networking android-sensors

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

所以,此时我意识到要从设备Accelerometer接收数据,我需要创建一个新的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());
        }
    }
}

然后在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垃圾邮件。我担心它会严重影响应用程序的性能,并且想知道是否还有其他方法来处理线程,但是继续连续发送数据?

1 个答案:

答案 0 :(得分: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());
    }