Java 使用共享向量的SensorEventListener和计时器线程
处理从向量读取数据的竞争线程的最佳方法是什么 我正在尝试编写一个android应用程序,我正在尝试定期读取传感器数据并将其写入文件,然后将文件上传到远程服务器Java 使用共享向量的SensorEventListener和计时器线程,java,android,multithreading,vector,Java,Android,Multithreading,Vector,处理从向量读取数据的竞争线程的最佳方法是什么 我正在尝试编写一个android应用程序,我正在尝试定期读取传感器数据并将其写入文件,然后将文件上传到远程服务器 class calculateSensorData extends TimerTask { public synchronized void run() { for (Datapoint item : data) { //use data } dat
class calculateSensorData extends TimerTask {
public synchronized void run() {
for (Datapoint item : data) {
//use data
}
data.clear();
}
}
作为第一步,我为每个传感器注册SensorEventListener,然后,每当传感器值发生变化时,我将新值推送到向量()
。这里,数据
是用户定义对象的向量
@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);
}
}
作为下一步,我使用定时器
对象定期从数据
向量读取数据,并将其发送到远程服务器
class calculateSensorData extends TimerTask {
public synchronized void run() {
for (Datapoint item : data) {
//use data
}
data.clear();
}
}
主要问题是,当我试图访问TimerTask
中的数据向量时,我得到了java.util.ConcurrentModificationException
我认为这是因为传感器侦听器线程和计时器线程都试图同时更新/修改共享向量
我通过在计时器任务开始时取消注册侦听器来解决这个问题。但这不是一个好的解决方案
无需在每次计时器
启动时取消注册和重新注册所有传感器侦听器即可完成此操作的任何其他方法。矢量不同步..这也是我的想法。但我不知道为什么会这样。(为了冗余,我甚至尝试了帖子中显示的同步方法)