我有一个LinkedList的ArrayList,用于将我的传感器捕获的数据存储在一个线程中(在ArrayList对象上使用synchronized)
捕获后,传感器事件被添加,我可以看到链接列表增加,但第一个和最后一个元素总是最后一个捕获事件......某些地方有问题......?
// main thread ('samplingFifoQueues' passed as an arg to be synchronized ...)
public volatile LinkedList<SensorEvent> accelFifoQueue = new LinkedList<SensorEvent>();
public volatile LinkedList<SensorEvent> magnetFifoQueue = new
.......
public volatile ArrayList<LinkedList<SensorEvent>> samplingFifoQueues = new ArrayList<LinkedList<SensorEvent>>();
在我的捕获线程中,我添加了传感器事件
LinkedList<SensorEvent> accelFifoQueue;
LinkedList<SensorEvent> magnetFifoQueue;
......
ArrayList<LinkedList<SensorEvent>> samplingFifoQueues;
.....
public void onSensorChanged(SensorEvent sensorEvent) {
...
synchronized (samplingFifoQueues) {
switch (sensorEvent.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
Log.d(TAG, "new accel sensor event at: " + sensorEvent.timestamp );
accelFifoQueue.add(sensorEvent);
SensorEvent nse = accelFifoQueue.getLast();
SensorEvent lse = accelFifoQueue.getFirst();
Log.d(TAG, "accel: " + accelFifoQueue.size() + " elements, last at: " + nse.timestamp + " , first at: " + lse.timestamp);
break;
....
日志输出指示每个新事件之后的第一个和最后一个时间戳,第一个是始终=到最后一个,即使大小增加:
new accel sensor event at: 1391793870096061895
accel: 1 elements, last at: 1391793870096061895 , first at: 1391793870096061895
new accel sensor event at: 1391793870117302130
accel: 2 elements, last at: 1391793870117302130 , first at: 1391793870117302130
new accel sensor event at: 1391793870121208380
accel: 3 elements, last at: 1391793870121208380 , first at: 1391793870121208380
new accel sensor event at: 1391793870129020880
accel: 4 elements, last at: 1391793870129020880 , first at: 1391793870129020880
答案 0 :(得分:1)
根据帖子中的回答:How to make a copy of the Android Sensor SensorEvent Object
传感器事件被覆盖......这是一个系统类,所以我需要做自己的克隆对象......
答案 1 :(得分:0)
这是因为你正在使用ArrayList,并且ArrayList存储了sensor event objet的引用,所以,你添加到这个数组列表中的所有内容都可能是同一个对象的引用,这就是为什么数组中的元素列表始终是最后一次捕获事件。