1

場所が変更されるたびにローカル 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
4

1 に答える 1