android LinkedList,奇怪的行为

时间:2014-02-07 17:53:31

标签: android linked-list

我有一个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

2 个答案:

答案 0 :(得分:1)

根据帖子中的回答:How to make a copy of the Android Sensor SensorEvent Object

传感器事件被覆盖......这是一个系统类,所以我需要做自己的克隆对象......

答案 1 :(得分:0)

这是因为你正在使用ArrayList,并且ArrayList存储了sensor event objet的引用,所以,你添加到这个数组列表中的所有内容都可能是同一个对象的引用,这就是为什么数组中的元素列表始终是最后一次捕获事件。