- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写一个需要保留来自加速度计的值的应用程序。我通过使用 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 的新手。
最佳答案
这是 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/
我目前正在编写一个简单的 android 应用程序来计算设备 imu 的偏差。在执行此操作时,我遇到了 event.timestamp 值的问题 使用代码: float dT = (event.tim
我正在尝试将事件时间戳转换为日期,我的代码: Calendar c = Calendar.getInstance(); c.setTimeInMillis(event.timestamp/100000
我正在检测设备的方向以检查它是否倒置在表面上,然后调用方法。我遇到的问题是,用户可能会无意中将设备的方向瞬间转向该位置并返回正面朝上的位置以纠正他们的错误,但是该方法在他们第一次这样做时仍会被调用。
我的应用程序使用 step detector sensor API's 在后台执行计步在 android 4.4.X 中引入。 我的应用程序必须知道每个步骤事件的确切时间(至少精确到一秒)。 因为我执
我正在使用 Sensor.TYPE_STEP_COUNTER。据我所知,android SensorEvent 自重启后保持一个值。在调用 onSensorChanged 方法后,我可以使用以下代码获
我目前正在开发一个 android 应用程序。我必须用事件时间记录加速度计传感器事件坐标。我得到了像“3497855005850”这样的传感器事件时间戳,但我无法将事件时间戳转换为用户可读的日期时间格
我已阅读此文档 -> SensorEvent 然后,我发现为了获取 TYPE_PRESSURE 传感器类型的值,我需要监听 SensorEventListener。 问题是缺少 TYPE_PRESSU
我测试了指南针应用程序的源代码。此应用程序已安装在 ginger bread and jelly blast 上。问题是我的指南针应用程序在 jellyblast 中不起作用,但在 Gingerbre
我正在编写一个需要保留来自加速度计的值的应用程序。我通过使用 ArrayList 来执行此操作,然后在调用 onAccelerationChanged(...) 时,我只需将这些值添加到列表中。问题是
我正在尝试编写一项服务来测试实现 onSensorChanged(SensorEvent event) 的类,方法是将我可以生成的数据传递给它,就好像它来自传感器一样。我遇到的问题是我无法创建自己的
我刚刚意识到,在 Android 上,您从 GPS 位置更新获得的时间戳是自纪元以来以毫秒为单位,而 SensorEvent 更新(例如加速度计)的时间戳是自启动以来以 ns 为单位。 我想将 GPS
我有一个 sparesArray,我用它来存储和批处理 SensorEvents,方法是保留每个传感器 typeId 和 SensorEvent 对象,直到计时器触发。 SparseArray s
我要测试功能 onSensorChanged (SensorEvent event){..} 在模拟器上。我想创建一个新的 SensorEvent 对象。我找到了一个不错的链接: http://dow
我质疑自己 SensorEvent.timestamp 中的时间戳是什么意思。出现像 3548712982000 这样的数字。这对任何事情都不合理:自 1970 年以来的纳秒/毫秒等。这可能是一些溢出
我目前正在从加速度计、磁力计和陀螺仪获取时间戳,并在 Android 设备上与 GPS 位置执行传感器融合。我使用 SensorEvent.timestamp 获取传感器时间戳和 Location.g
如何对 android SensorEvent 和 MotionEvent 类进行单元测试? 我需要为单元测试创建一个 MotionEvent 对象。 (我们有 MotionEvent 的 obt
我是一名优秀的程序员,十分优秀!