我编写了一个用于将智能手机传感器数据存储在SQLite数据库中的Android7应用程序。例如,对于加速度计,我得到的值如下:
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文件(在根手机上)。我可以直接将其存储在数据库中(如传感器数据),也可以直接将其转储到文本文件中。
哪一个是更好的选择,是否有可能文本文件会被破坏(例如,当它没有在结束时正确关闭或当有写错误时)?我认为数据库是安全的,应该始终保持一致的状态。
发布于 2019-02-13 18:33:09
SENSOR_DELAY_UI = 60,000微秒= 60,0毫秒延迟。
我们无法确定获取时间戳的速度。在昂贵的设备上,这可能需要10毫秒。在便宜的设备上,可能是100毫秒。
另外,将数据存储在数据库/文件中会增加很多毫秒,启动一个新线程也会增加很多毫秒。
快速提醒:不要忘记您指定的延迟仅为建议的延迟,因此延迟可以低于指定的延迟。来源
所以:在你的超级超级电话上获取这些时间戳可能不是什么问题,因为它足够快,可以获取时间戳并将其存储在数据库/文件中,但在其他速度较慢的手机上可能会出现问题。
你的读数会有缺口。如果一个对onSensorChanged()的调用需要10秒,并且每50微秒函数就是指定的延迟,那么在每10秒和每10秒之间再加上50个微秒之间就会有一个调用。
您可以接受这样一个事实,即有时必须“跳过”onSensorChanged()调用。为了降低发生这种情况的可能性,您可以指定更大的延迟。您可以使用mSensorManager.registerListener(this, mAccelerometer, 1000*1000);指定自定义延迟时间(以微秒为单位)。
关于你的第二个问题:我不太了解有根的手机,但我知道文件。
读取/dev/ out /event7 7并将其存储在数据库中可能比将内容快速写入某个文本文件要花费更长的时间,如果这仍然是快速的话。
如果有2个写操作同时写入1个文件,则会发生文本文件的损坏。在打开第二个输出流之前,应该始终关闭第一个输出流。通常,当捕获写入错误时,总是关闭输出流。做这两件事,确保没有文件损坏。
一般来说,向数据库写入比写入文本文件更安全,因为数据库设计用于处理多次写入、潜在危险的写入等。
https://stackoverflow.com/questions/54674787
复制相似问题