gpt4 book ai didi

java - ArrayList.add(...) 开始覆盖值

转载 作者:太空宇宙 更新时间:2023-11-03 13:03:47 25 4
gpt4 key购买 nike

我正在编写一个需要保留来自加速度计的值的应用程序。我通过使用 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 的新手。

最佳答案

这是 documented :

NOTE: The application doesn't own the event object passed as a parameter and therefore cannot hold onto it. The object may be part of an internal pool and may be reused by the framework.

通过添加对列表的引用,您所做的正是您被告知不要做的事情。

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

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

关于java - ArrayList<SensorEvent>.add(...) 开始覆盖值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7691378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com