Поворот экрана, ListView+Cursor
Добавлено: 19 фев 2013, 18:54
День добрый!
Самый обычный Activity. Cursor+SimpleCursorAdapter+ListView. Все работает, красота
Но поворачивю экран и начинают валится ошибки. Весь лог приводить не буду, там четыре сотни строк, но основные из них, как я понимаю эти:
02-19 17:12:53.503: W/SQLiteCompiledSql(349): Releasing statement in a finalizer. Please ensure that you explicitly call close() on your cursor: select _id, name from goods
02-19 17:12:53.503: W/SQLiteCompiledSql(349): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
... тут стек ...
02-19 17:12:53.532: E/Database(349): close() was never explicitly called on database '/data/data/slava.testandroid/databases/testbase'
02-19 17:12:53.532: E/Database(349): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
...ну и дальше это все еще несколько раз повторяется.
Правильно ли я понимаю, что нечто хочет закрыть базу, но этого не дает сделать открытый курсор ?
Во всей этой ситуации есть пара примечательных моментов:
1) возникает это далеко не при каждом повороте экрана, может десять раз повернуться без проблем, а потом 3 раза выдать по такой вот "простыне"
2) замерев на секунду, пока заполняется лог, приложение затем продолжает работать как ни в чем не бывало.
Поскольку нет уверенности, что ошибка не скажется на работе программы позже, хочется с этим что-то сделать, но вот на ум ничего не приходит, кроме в onPause отключать адаптер от ListView, закрывать курсор, закрывать базу, а в onResume вернуть все обратно. И даже получилось, но при этом ListView становится как новый, т.е. показывает опять самое начало курсора.
Может еще как-то можно выкрутится ? Или как-нть сохранить состояние ListView с последующим его восстановлением ?
И еще один вопросик, при повороте экрана из вертикального положения в горизонтальное, пара OnPauseResume вызывается один раз, а вот при обратном развороте, почему-то два:
Ctrl+F12
02-19 17:12:38.442: I/BMRService(349): MainActivity: onPause
02-19 17:12:38.542: I/BMRService(349): MainActivity: onResume
Ctrl+F12
02-19 17:12:43.792: I/BMRService(349): MainActivity: onPause
02-19 17:12:43.843: I/BMRService(349): MainActivity: onResume
02-19 17:12:44.192: I/BMRService(349): MainActivity: onPause
02-19 17:12:44.262: I/BMRService(349): MainActivity: onResume
Ctrl+F12
02-19 17:12:46.732: I/BMRService(349): MainActivity: onPause
02-19 17:12:46.953: I/BMRService(349): MainActivity: onResume
Ctrl+F12
02-19 17:12:49.652: I/BMRService(349): MainActivity: onPause
02-19 17:12:49.732: I/BMRService(349): MainActivity: onResume
02-19 17:12:50.033: I/BMRService(349): MainActivity: onPause
02-19 17:12:50.212: I/BMRService(349): MainActivity: onResume
Это глюк эмулятора ?
Самый обычный Activity. Cursor+SimpleCursorAdapter+ListView. Все работает, красота
Но поворачивю экран и начинают валится ошибки. Весь лог приводить не буду, там четыре сотни строк, но основные из них, как я понимаю эти:
02-19 17:12:53.503: W/SQLiteCompiledSql(349): Releasing statement in a finalizer. Please ensure that you explicitly call close() on your cursor: select _id, name from goods
02-19 17:12:53.503: W/SQLiteCompiledSql(349): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
... тут стек ...
02-19 17:12:53.532: E/Database(349): close() was never explicitly called on database '/data/data/slava.testandroid/databases/testbase'
02-19 17:12:53.532: E/Database(349): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
...ну и дальше это все еще несколько раз повторяется.
Правильно ли я понимаю, что нечто хочет закрыть базу, но этого не дает сделать открытый курсор ?
Во всей этой ситуации есть пара примечательных моментов:
1) возникает это далеко не при каждом повороте экрана, может десять раз повернуться без проблем, а потом 3 раза выдать по такой вот "простыне"
2) замерев на секунду, пока заполняется лог, приложение затем продолжает работать как ни в чем не бывало.
Поскольку нет уверенности, что ошибка не скажется на работе программы позже, хочется с этим что-то сделать, но вот на ум ничего не приходит, кроме в onPause отключать адаптер от ListView, закрывать курсор, закрывать базу, а в onResume вернуть все обратно. И даже получилось, но при этом ListView становится как новый, т.е. показывает опять самое начало курсора.
Может еще как-то можно выкрутится ? Или как-нть сохранить состояние ListView с последующим его восстановлением ?
И еще один вопросик, при повороте экрана из вертикального положения в горизонтальное, пара OnPauseResume вызывается один раз, а вот при обратном развороте, почему-то два:
Ctrl+F12
02-19 17:12:38.442: I/BMRService(349): MainActivity: onPause
02-19 17:12:38.542: I/BMRService(349): MainActivity: onResume
Ctrl+F12
02-19 17:12:43.792: I/BMRService(349): MainActivity: onPause
02-19 17:12:43.843: I/BMRService(349): MainActivity: onResume
02-19 17:12:44.192: I/BMRService(349): MainActivity: onPause
02-19 17:12:44.262: I/BMRService(349): MainActivity: onResume
Ctrl+F12
02-19 17:12:46.732: I/BMRService(349): MainActivity: onPause
02-19 17:12:46.953: I/BMRService(349): MainActivity: onResume
Ctrl+F12
02-19 17:12:49.652: I/BMRService(349): MainActivity: onPause
02-19 17:12:49.732: I/BMRService(349): MainActivity: onResume
02-19 17:12:50.033: I/BMRService(349): MainActivity: onPause
02-19 17:12:50.212: I/BMRService(349): MainActivity: onResume
Это глюк эмулятора ?