ArrayList <sensorevent> .add(...)开始覆盖值</sensorevent>

时间:2011-10-07 18:28:43

标签: java android

我正在编写一个需要保留来自加速度计的值的应用。我这样做是通过使用ArrayList,然后当onAccelerationChanged(...)被调用时,我只是将这些值添加到列表中。问题是,在这么多值(从不一致)被推入列表之后,它开始用我正在添加的值覆盖值。我认为我做了一些愚蠢的事情所以我采用了'Accelerometer Play Sample'并修改了onSensorChanged(...)来做同样的事情。这样做会复制问题。

变量添加到类:

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。

1 个答案:

答案 0 :(得分:5)

这是documented

  

注意:应用程序不拥有作为参数传递的事件对象,因此无法保留它。该对象可以是内部池的一部分,并且可以由框架重用。

通过添加对列表的引用,您正在做的就是告诉您不要的内容。

基本上,框架会反复向您传递对同一对象的引用,每次都会更改对象中的值。

如果您需要保留不同的值,则需要将它们复制到您自己的对象中,并将 引用添加到您的列表中(或克隆您传递给另一个的值)如果你愿意,可以SensorEvent