Android:如何将传感器数据onSensorChanged保存到数据库?

时间:2013-02-01 12:27:03

标签: android database arraylist dynamic-data android-sensors

我正在编写一个Android应用,我正在从手机传感器获取加速计数据,直到用户退出。然后我修改数据并尝试将其保存到现有的数据库中。一切正常,但是当我在 onSensorChanged 方法中调用 saveToDatabase ()方法时,应用程序开始工作非常慢并且变得没有响应并且很快就崩溃了。 所以,问题是我经常调用saveToDatabase() ......

有没有办法避免这种情况?

  • 可能是 ArrayList / LinkedList / ArrayDeque ,其中必须收集传感器数据,并在5分钟后保存到数据库?
  • 或者将所有内容放在缓冲区中,当用户退出时,将所有内容从中提取到数据库中?
  • 修改saveToDabase方法,使其使用 beginTransaction 而不是 insert -method?

        protected void saveToDatabase(){
             contentValues.put("SensorSensitivity", sensorSensitivity);
             contentValues.put("AccDataX", accelerometerData[0]);
             contentValues.put("AccDataY", accelerometerData[1]);
             contentValues.put("AccDataZ", accelerometerData[2]);
             contentValues.put("timeStamp", System.currentTimeMillis());
             long affectedColumnId = sqliteDatabase.insert("tName", null, contentValues);
             contentValues.clear();
    }
    

1 个答案:

答案 0 :(得分:0)

Android文档建议在您使用IO的每个地方,使用不同的线程进行磁盘操作。

我建议您使用一个线程来接收onSensorChanged事件,将其保存到内存中,可能会添加时间戳和值。将几个这样的值添加到数组,然后使用处理程序或其他方式将此结构传递给另一个线程。该线程应该将其保存到数据库中,即。循环遍历所有收集的值并保存每个值,例如saveToDatabase。这条路。即使长队列等待写入磁盘,UI也应始终响应。

这可能有用,但应该有一些关于值的保存速度和传入队列有多大的反馈。如果它太长,您可能会删除一些值以防止完全记忆。也许保存线程会使用处理程序事件发送到UI线程,该队列已满并且不需要新值一段时间。当它减少队列或使其为空时,它会告诉UI线程再次开始发送。