0

ユーザーが終了するまで、電話のセンサーから加速度計のデータを取得する Android アプリを作成しています。その後、データを変更し、既存のデータベースに保存しようとします。すべて正常に動作しますが、 onSensorChangedメソッドでsaveToDatabase () メソッドを呼び出すと、アプリの動作が非常に遅くなり、応答しなくなり、すぐにクラッシュします。だから、問題は私があまりにも頻繁にsaveToDatabase() を呼び出していることです...

それを回避する方法はありますか?

  • センサーデータを収集し、5 分後に DB に保存する必要があるArrayList/LinkedList/ArrayDequeを使用している可能性がありますか?
  • または、すべてをバッファに入れ、ユーザーが終了すると、そこからすべてをデータベースに抽出しますか?
  • insertメソッドの代わりにbeginTransactionを使用するように saveToDabase メソッドを変更しますか?

        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を使用するすべての場所で、ディスク操作に異なるスレッドを使用することを提案しています。

1つのスレッドを使用してonSensorChangedイベントを受信し、それをメモリに保存し、タイムスタンプと値を追加することをお勧めします。そのような値をいくつか配列に追加してから、ハンドラーまたは他の方法を使用して、この構造体を別のスレッドに渡します。そのスレッドはそれをデータベースに保存する必要があります。収集されたすべての値をループし、saveToDatabaseのようにそれぞれを保存します。こちらです。長いキューがディスクへの書き込みを待機している場合でも、UIは常に応答する必要があります。

これは機能する可能性がありますが、値の保存の速度と着信キューの大きさについてのフィードバックがあるはずです。長すぎる場合は、メモリがいっぱいになるのを防ぐためにいくつかの値を削除することがあります。たぶん、スレッドを保存すると、ハンドラーイベントを使用してUIスレッドに送信され、そのキューはいっぱいで、しばらくの間新しい値を必要としません。キューを減らすか空にすると、UIスレッドに送信を再開するように指示します。

于 2013-02-01T13:30:59.620 に答える