2013-02-06 3 views
3

Я сбор данных в моем Android приложения, как следует (это урезанная версия):данные Android датчика потерян

public class Main extends Activity { 

    ... 

    public void log5secs(){ 
     try { 
      CollectData collectData = new CollectData(this); 
      // collect data for five seconds in the background 
      Thread.sleep(5000); 
      Log.d("unregister", "gyro from Main: "+collectData.gyroscopeResults.size()); 
      fingerprint.finish(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
     } 
    }   

} 

public class CollectData implements SensorEventListener { 

    ArrayList<SensorEvent> gyroscopeResults = new ArrayList<SensorEvent>(); 

    public CollectData(Context context){ 
     sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); 
     gyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); 
     sensorManager.registerListener(this, gyroscope, SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    public void onSensorChanged(SensorEvent event) { 
     gyroscopeResults.add(event); 
     Log.d("SensorChanged", "gyro results size: "+gyroscopeResults.size()); 
    } 

    public void finish(){ 
     unregister(); 
    } 

    private void unregister() { 
     Log.d("Unregister", "gyro results size before unregister: "+gyroscopeResults.size()); 
     sensorManager.unregisterListener(this); 
    } 
} 

Таким образом, сообщения журнала показывают, что каждый раз, когда onSensorChanged событие называется, размер ArrayList увеличивается (доходит до 26 за пять секунд).

Однако, когда размер запрашивается из Main или из-за того, что вызывается unregister(), размер ArrayList равен нулю. В отладчике я не вижу, где он изменяется.

Что случилось с моими данными ???

Я запускаю его на HTC Sensation XL.

ОБНОВЛЕНИЕ: Получил дополнительную информацию! Из любопытства я сделал гироскоп ArrayListResults статическим полем в классе Main. Эффект был интересен - во второй раз, когда запись была сделана, результаты первого были видны (но не в первый раз). Я предполагаю, что это означает, что первичный поток заканчивается до того, как данные датчика записываются - какая-то проблема буферизации ???

ответ

2

Ваши данные не теряется, проблема в том, что Thread.sleep() останавливает программу в течение 5 секунд (включая сбор датчика), то он выполняет линии fingerprint.finish();после этого он начинает сбор датчика.

Поэтому, когда вы звоните Log.d("Unregister", "gyro results size before unregister: "+gyroscopeResults.size());, вы получаете 0, потому что данные датчика не были записаны во время сна.

Вот несколько предложений, чтобы сделать вашу программу работать, как вы ожидаете

Чтобы собрать данные для 5 секунд, вы можете использовать Timer (здесь я отмены таймера в течение 5 секунд, но вы можете продолжить сбор после очистки ArrayList, чтобы не запускать из памяти)

final Timer timer = new Timer(); 
final CollectData collectData = new CollectData(MainActivity.this); 

timer.schedule(new TimerTask() { 
boolean started = false; 
@Override 
public void run() { 
    if (!started) { 
    Log.d("unregister", "BEFORE] gyro from Main: " + collectData.gyroscopeResults.size()); 
    started = true; 
    } else { 
    collectData.finish(); 
    Log.d("unregister", "AFTER] gyro from Main: " + collectData.gyroscopeResults.size()); 
    timer.cancel(); 
    } 
    } 
}, 0, 5000); 

Другого решения, может быть проще, если вы хотите сохранить Thread.sleep() это запустить log5secs() в Thread

new Thread() { 
    public void run() { 
     log5secs(); 
    } 
}.start(); 

Однако использование Timer будет более подходящим, если вы хотите непрерывно регистрировать датчик, который вы делаете что-то с данными каждые 5 секунд (например, войдите в файл и/или очистите ArrayList)

+0

Фантастично, я пробую это сейчас ... Я не могу наградить щедрость до завтра из-за ограничений, однако спасибо за этот ответ. – Alex

+0

Добро пожаловать, рад, что он сработал для вас – iTech

+0

Хорошо, реализовано с помощью таймера! Это работает :) Еще раз спасибо. – Alex

Смежные вопросы