使用共享Vector的SensorEventListener和Timer-thread

时间:2013-11-20 20:33:53

标签: java android multithreading vector

处理从向量中读取数据的竞争线程的最佳方法是什么?

我正在尝试编写一个Android应用程序,我正在尝试定期读取传感器数据并将其写入文件,然后将文件上传到远程服务器。

作为第一步,我为每个传感器注册SensorEventListener然后,每当传感器值发生变化时,我将新值推送到Vector()。这里data是用户定义对象的向量。

@Override

// when sensor value is changed, this method will be called.

public void onSensorChanged(SensorEvent event) {
  synchronized (this){
    Datapoint dp=new Datapoint(event.sensor.getType(),event.values);
    data.add(dp);
  }
}

下一步,我使用Timer对象定期从data向量中读取数据并将其发送到远程服务器。

class calculateSensorData extends TimerTask {
      public synchronized void run() {
       for (Datapoint item : data) {
              //use data    
       }
       data.clear();
     }
}

主要问题是当我尝试访问TimerTask内的数据向量时,我得java.util.ConcurrentModficiationException

我认为这是因为传感器侦听器线程和计时器线程都在尝试同时更新/修改共享Vector。

我通过在Timer任务开始时取消注册侦听器来解决问题。但那不是一个好的解决方案。

每次Timer触发时,如果没有取消注册并重新注册所有传感器侦听器,任何其他方法都可以实现此目的。

0 个答案:

没有答案