我正在编写一个需要保留来自加速度计的值的应用。我这样做是通过使用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次添加后打印出的列表。正如您所知,应该添加的值与列表本身不匹配,并且列表中的最后一个值和倒数第二个值重复。
我通过创建一个接受事件的新类并复制这些值来解决这个问题。然后我让ArrayList取代该类。它有效,但我不明白为什么,并希望有人可以教我,因为我不熟悉Java和Android。
答案 0 :(得分:5)
这是documented:
注意:应用程序不拥有作为参数传递的事件对象,因此无法保留它。该对象可以是内部池的一部分,并且可以由框架重用。
通过添加对列表的引用,您正在做的就是告诉您不要的内容。
基本上,框架会反复向您传递对同一对象的引用,每次都会更改对象中的值。
如果您需要保留不同的值,则需要将它们复制到您自己的对象中,并将 引用添加到您的列表中(或克隆您传递给另一个的值)如果你愿意,可以SensorEvent
。