0

我正在编写一个 android 应用程序,在该应用程序中我从手机的传感器获取加速度计数据,直到用户退出。之后我修改数据并尝试将其保存到现有数据库中。一切正常,但是当我在 onSensorChanged 方法中调用我的saveToDatabase ( ) 方法时,应用程序开始运行非常缓慢并且变得无响应并在不久之后崩溃。所以,问题是我经常调用 saveToDatabase() ......

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

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

        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();
    }
    
4

1 回答 1

0

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

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

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

于 2013-02-01T13:30:59.620 回答