場所が変更されるたびにローカル SQLite データベースに書き込む場所追跡アプリを作成しました。残念ながら、追跡中に約 7 ~ 8 時間後にアプリがクラッシュします。残念ながら、デバイスをデバッガーに接続している場合は発生しないため、添付できるログはありません。さらに役立つかもしれない情報:
- バックグラウンドから復帰する前にアプリがクラッシュするため (追跡データで明確に確認できます)、このバグを他のアプリから除外できます。
- データベースの代わりにテキストファイルに書き込もうとしましたが、成功しませんでした(クラッシュする前に約3時間実行しました)
- 追跡間隔の変更 (通常は 5 秒、最速の間隔は 1 秒): 同じ結果のアプリが 7 ~ 8 時間後にクラッシュする
以下にいくつかのコード スニペットを示します。
場所変更イベント
@Override
public void onLocationChanged(Location location) {
if(location == null){
location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if(location == null) {
return;
}
}
Log.d(TAG, location.toString());
double currentLatitude = location.getLatitude();
double currentLongitude = location.getLongitude();
ActivitylogRepo activityRepo = new ActivitylogRepo(this);
Activitylog activity = new Activitylog();
activity.activity = "Position";
activity.timestamp = getDateTime();
activity.value2 = String.valueOf(currentLatitude);
activity.value3 = String.valueOf(currentLongitude);
activityRepo.insert(activity);
}
データベース挿入コマンド
public int insert(Activitylog activitylog) {
//Open connection to write data
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(Activitylog.KEY_activity, activitylog.activity);
values.put(Activitylog.KEY_timestamp, activitylog.timestamp);
values.put(Activitylog.KEY_value1, activitylog.value1);
values.put(Activitylog.KEY_value2, activitylog.value2);
values.put(Activitylog.KEY_value3, activitylog.value3);
values.put(Activitylog.KEY_value4, activitylog.value4);
// Inserting Row
long activitylog_id = db.insert(Activitylog.TABLE, null, values);
db.close(); // Closing database connection
return (int) activitylog_id;
}
サービスの初期化
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mGoogleApiClient.connect();
mLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(20 * 1000) // 20s in ms
.setFastestInterval(5 * 1000); // 5s in ms