gpt4 book ai didi

安卓传感器数据丢失

转载 作者:太空狗 更新时间:2023-10-29 13:31:54 32 4
gpt4 key购买 nike

我正在我的 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 的大小都会增加(在 5 秒内达到 26)。

但是,当从 Main 请求大小时或由于调用 unregister() 时,ArrayList 的大小为零。在调试器中,我看不到它在哪里发生了变化。

我的数据怎么了???

我在 HTC Sensation XL 上运行它。

更新:获得了更多信息!出于好奇,我将 ArrayList gyroscopeResults 设为 Main 类中的静态字段。效果很有趣——第二次录制完成时,第一次的结果是可见的(但不是第一次)。我想这意味着主线程在传感器数据被记录之前完成了——某种缓冲问题???

最佳答案

您的数据没有丢失,Thread.sleep() 中的问题使程序暂停 5 秒(包括传感器收集),然后执行行 fingerprint.finish(); 在此之后它开始传感器收集。

所以当你调用 Log.d("Unregister", "gyro results size before unregister: "+gyroscopeResults.size()); 你得到 0 因为没有在程序休眠时记录传感器数据。

这里有一些建议可以使您的程序按预期运行

要收集5秒的数据,你可以使用定时器(这里我是在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() 是在 Thread 中运行 log5secs()

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

但是,如果您希望连续记录传感器日志,您可以每 5 秒对数据执行一些操作(例如,记录到文件和/或清除数组列表)

关于安卓传感器数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14740652/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com