2013-02-01 120 views
0

我正在寫一個Android應用程序,其中我正在從手機的傳感器獲取加速度計數據,直到用戶退出。之後,我修改數據並嘗試將其保存到現有的數據庫中。一切工作正常,但當我打電話給我的saveToDatabase()方法在onSensorChanged方法,然後該應用程序開始工作非常緩慢,變得沒有響應和崩潰不久後。 所以,問題是,我打電話saveToDatabase()太往往 ...Android:如何將傳感器數據保存到數據庫?

有沒有辦法避免這種情況?

  • 可以與的ArrayList /鏈表/ ArrayDeque其中所述傳感器數據都被收集並保存到DB 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(); 
    } 
    
+0

從服務中調用此函數,以便應用程序中的其他功能不會受到影響 – sachin

+0

除了sachin所說的之外,我喜歡您節省一堆點並將它們作爲批處理插入的想法。 – Sparky

回答

0

Android文檔建議在每一個地方,你用IO工作地點,使用不同的線程進行磁盤操作。

我建議你應該使用一個線程來接收onSensorChanged事件,將其保存到內存中,也許會添加時間戳和值。向數組中添加幾個這樣的值,然後使用處理程序或其他方式將此結構傳遞給另一個線程。該線程應將其保存到數據庫中,即。循環所有收集的值並保存每個像saveToDatabase。這條路。即使在長隊列等待寫入磁盤時,UI也應始終保持響應。

這可能會起作用,但應該有一些關於值保存速度和入站隊列有多大的反饋。如果時間太長,可能會丟失一些值以防止完整內存。也許保存線程將使用處理程序事件發送到UI線程,該隊列已滿,它不需要一段時間的新值。當它減少隊列或使其變空時,它會通知UI線程再次開始發送。

+0

感謝傢伙的建議:)現在一切正常。 正如你所建議的,我做了一個新的線程負責數據庫,以便它與MainActivity一起工作。我還將傳感器值保存在ArrayLists中,當它們填滿時,我將它們轉發給單獨的線程。然後我清空這些ArrayLists並開始在saveToDatabase線程自己運行時再次填充它們。 – Darki

相關問題