2011-10-07 56 views
3

我在写一个需要保存来自加速度计的值的应用程序。我通过使用ArrayList来做到这一点,然后当onAccelerationChanged(...)被调用时,我只需将这些值添加到列表中。问题是,如此多的值(从不一致)被推入列表后,它开始用我正在添加的值覆盖这些值。我想我正在做一些愚蠢的事情,所以我拿着'加速器播放示例'并修改onSensorChanged(...)来做同样的事情。这样做会重现这个问题。ArrayList <SensorEvent> .add(...)开始覆盖值

变量添加到类:

private ArrayList<SensorEvent> _accelData = new ArrayList<SensorEvent>(); 

onSensorChanged:

@Override 
public void onSensorChanged(SensorEvent event) 
{ 
    if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) 
    return; 

    Log.e("Event to Add", event.timestamp + ", " + event.accuracy + ", " + event.values[0] + ", " + event.values[1] 
     + ", " + event.values[2]); 

    _accelData.add(event); 

    if (_accelData.size() > 25) { 
    for (SensorEvent tmp_event : _accelData) { 
     Log.e("Events in list", tmp_event.timestamp + ", " + tmp_event.accuracy + ", " + tmp_event.values[0] + ", " 
      + tmp_event.values[1] + ", " + tmp_event.values[2]); 
    } 

    _accelData.clear(); 
    } 
} 

在左边是这应该被添加并在右侧为26后打印出的列表中的每个事件添加被执行。正如你所说的那样,应该添加的值与列表本身不匹配,并且列表中的最后一个值和倒数第二个值有很多重复。

enter image description here

,我通过提出一个新的类,它在一个事件,并复制这些值修正了这个。然后我让ArrayList取而代之。它的工作原理,但我不明白为什么,并希望有人能够教育我,因为我是Java和Android的新手。

回答

5

这是documented

注:该应用程序没有自己作为参数传递的事件对象,因此不能抓住它。该对象可能是内部池的一部分,可能会被框架重用。

通过添加对列表的引用,您正在执行的操作完全取决于您告诉不要的内容。

基本上,框架会重复地传递给同一对象的引用,每次更改对象内的值。

如果需持不同的值,你需要他们你传递的值复制到自己的对象,并添加参考列表(或克隆到另一个SensorEvent,如果你想)。

+0

我必须是盲人,因为我没有看到搜索文档后:)。感谢您的指导! –