我编写了一个Android 7应用程序,用于将智能手机的传感器数据存储在SQLite数据库中。例如,对于加速度计,我得到的值如下:
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_UI);
public final void onSensorChanged(SensorEvent event) {
long timeNano = System.nanoTime();
long timeMilli = System.currentTimeMillis();
// Save to database
}
可以看到,在每次调用onSensorChanged
时(即当新的传感器值到达时),我还以毫秒和纳秒为单位检索并存储了当前时间戳。我认为检索这些时间戳总是需要一些时间(数十毫秒)。我的传感器采样率很高。
为每个传感器值检索时间戳时是否有问题?我担心的是,如果传感器值到达的时间比检索毫秒级和纳秒级的时间戳所花费的时间更快,我会在传感器值上添加人为延迟(排队)。
第二,我也想转储/dev/input/event7
文件(在有根电话上)。我可以将其直接存储在数据库中(与传感器数据一样),也可以将其转储到文本文件中。
哪个是更好的选择,文本文件是否有可能被损坏(例如,当文件结尾处未正确关闭或出现写入错误时)?我认为数据库是安全的,应该始终保持一致状态。
答案 0 :(得分:1)
onSensorChanged()
= 60,000微秒= 60,0毫秒延迟。
我们无法确定获取时间戳的速度。 在昂贵的设备上,这可能需要10毫秒。在便宜的设备上,可能需要100毫秒。
此外,将数据存储在数据库/文件中会增加很多毫秒,因此引导新线程来完成此过程也是如此。
快速提醒:请不要忘记您指定的延迟是仅建议的延迟,因此延迟可以低于指定的延迟。 Source
所以:获取这些时间戳可能不是在您的超快超声波麦克风上出现的问题,因为它足够快以允许获取时间戳并将其存储在数据库/文件中,但是在其他速度较慢的手机上可能是一个问题
您的阅读会出现差距。如果一次致电onSensorChanged()
,例如10秒,并且每隔50微秒该功能是指定的延迟,那么每10秒至每10秒加50微秒之间就会有一次呼叫。
您可以接受有时必须“跳过” mSensorManager.registerListener(this, mAccelerometer, 1000*1000);
呼叫的事实。为了降低发生这种情况的可能性,您可以指定更大的延迟。您可以使用以下命令指定自定义延迟时间(以微秒为单位)
{{1}}
关于第二个问题: 我对生根电话知之甚少,但我对文件知之甚少。
如果仍然要快的话,读出/ dev / input / event7并将其存储在数据库中可能要比将内容快速写入某些文本文件花费的时间更长。
如果您有2个写入操作同时写入1个文件,则文本文件将损坏。在打开第二个输出流之前,应始终关闭第一个输出流。通常,在捕获写错误时,请始终关闭输出流。完成这两项操作,确保没有文件损坏。
通常,写数据库比写文本文件更安全,因为数据库被设计为处理多次写,潜在的危险写等。