2011-10-07 54 views
3

我在寫一個需要保存來自加速度計的值的應用程序。我通過使用ArrayList來做到這一點,然後當onAccelerationChanged(...)被調用時,我只需將這些值添加到列表中。問題是,如此多的值(從不一致)被推入列表後,它開始用我正在添加的值覆蓋這些值。我想我正在做一些愚蠢的事情,所以我拿着'加速器播放示例'並修改onSensorChanged(...)來做同樣的事情。這樣做會重現這個問題。ArrayList <SensorEvent> .add(...)開始覆蓋值

變量添加到類:

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的新手。

回答

5

這是documented

注:該應用程序沒有自己作爲參數傳遞的事件對象,因此不能抓住它。該對象可能是內部池的一部分,可能會被框架重用。

通過添加對列表的引用,您正在執行的操作完全取決於您告訴不要的內容。

基本上,框架會重複地傳遞給同一對象的引用,每次更改對象內的值。

如果需持不同的值,你需要他們你傳遞的值複製到自己的對象,並添加參考列表(或克隆到另一個SensorEvent,如果你想)。

+0

我必須是盲人,因爲我沒有看到搜索文檔後:)。感謝您的指導! –