Сбой при вращении устройства - проблемы жизненного цикла - PullRequest
2 голосов
/ 03 апреля 2012

В предыдущем вопросе мне сообщили, что мне не нужно поддерживать базу данных, если устройство поворачивается, поскольку оно использует локальную базу данных.

Я подумал, что, по крайней мере, могу сохранить источник данных для моегоСписок.У меня возникают проблемы при попытке сделать это, потому что я получаю сообщение об ошибке, что close () не был вызван в базе данных.Я звоню близко в onDestroy, хотя.

Кто-нибудь может увидеть, где я иду не так?Я просто хочу улучшить работу пользователей, сохранив данные для повторного заполнения списка после того, как они повернут устройство.

Другая вещь, которая меня смущает, - мои операторы журнала выходят в следующем порядке:

  • onCreate flight
  • первая установка
  • повторное использование источника данных
  • уничтожение активности

Я ожидал, что уничтожающая деятельность произойдет до повторного использованияисточник данных.

package com.testing.flights;

import android.app.ListActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.provider.BaseColumns;
import android.util.Log;
import android.widget.SimpleCursorAdapter;

public class FlightListActivity extends ListActivity {

private SQLiteDatabase database;
private String fields[] = {BaseColumns._ID, "name", "flights", "distance"};
private SimpleCursorAdapter datasource;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.v(ACTIVITY_SERVICE, "onCreate flights");

    datasource = (SimpleCursorAdapter) getLastNonConfigurationInstance();

    if (datasource == null) {
        database = getData();
        datasource = getCursor();
        Log.v(ACTIVITY_SERVICE, "first setup");
    }

    setListAdapter(datasource);
}

protected SQLiteDatabase getData() {
    DataBaseHelper myDbHelper = new DataBaseHelper(this.getApplicationContext());
    return myDbHelper.openDataBase();
}

protected CustomCursorAdapter getCursor() {
    Cursor data = database.query("pilots", fields, null, null, null, null, null);   
    final CustomCursorAdapter mysource = new CustomCursorAdapter(this, R.layout.row, data, fields, new int[] { R.id.id, R.id.name, R.id.flights, R.id.distance });
    return mysource;
}

@Override
public Object onRetainNonConfigurationInstance() {
    Log.v(ACTIVITY_SERVICE, "reusing datasource");
    final SimpleCursorAdapter myData = datasource;
    return myData;
}

@Override
protected void onDestroy() {
    Log.v(ACTIVITY_SERVICE, "destroying activity");
    database.close();
    super.onDestroy();
}

}

LogCat:

04-03 16:22:55.900: E/SQLiteDatabase(1860): close() was never explicitly called on database '/data/data/com.testing.flights/databases/club' 

Ответы [ 3 ]

1 голос
/ 03 апреля 2012

Я полагаю, что происходит то, что ОС ставит в приоритет создание новой Деятельности, а не разрушение старой.Поскольку onDestroy не гарантированно запускается (его можно убить), типично открыть вашу базу данных в onResume() и очистить себя в методе onPause().(onPause не будет убито, по крайней мере, в сотах +).В результате того, что у вас есть сейчас, новое действие пытается открыть базу данных, которая уже открыта (это мое предположение).Не пытаясь сохранить курсор таким образом, я не на 100% уверен, что это решит вашу проблему, но использование этой части жизненного цикла является нормальным случаем для вещей, не относящихся к типу установки.

0 голосов
/ 03 апреля 2012
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub

        super.onConfigurationChanged(newConfig);

          if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {

          } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

          }

    }
0 голосов
/ 03 апреля 2012

Добавьте строку ниже в файле манифеста для FlightListActivity

android:configChanges="keyboardHidden|orientation"  

Попробуйте сейчас, я думаю, что приложение не будет аварийно завершать работу, поскольку при использовании вышеуказанной строки при повороте устройства из альбомной в портретную или наоборот не будет вызываться метод oncreate снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...