Поворот экрана, ListView+Cursor
Поворот экрана, ListView+Cursor
День добрый!
Самый обычный 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
Это глюк эмулятора ?
Re: Поворот экрана, ListView+Cursor
всё просто, в паузе нужно закрывать соединение и курсор, при резуме открывать... если не хотите этого то запрещайте поворот экрана.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Поворот экрана, ListView+Cursor
Пробовал. Если до поворота я был в конце списка, после поворота оказываюсь в начале
Re: Поворот экрана, ListView+Cursor
что пробывали? если в паузе закрыть а в резуме открыть то конечно вначале будете, или сохраняйте состояние листа или запрещайте поворот экрана
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Поворот экрана, ListView+Cursor
вот-вот, можно по-подробнее ?rezak90 писал(а):сохраняйте состояние листа
а то нашел только int ListView.getFirstVisiblePosition(), а это только половина дела.
Сам view прекрасно восстанавливается автоматически, даже при возникновении ошибки, причем вместе с коннектом и курсором.
Re: Поворот экрана, ListView+Cursor
и чем же getFirstVisiblePosition() не подходит? возвращает позицию сверху, в резуме делаем setSelection и всё
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Поворот экрана, ListView+Cursor
О, стыд-то какой (
setSelector, setSelected видел, а нужное проморгал. Да и искал обратное, что-то вроде setFirst, setVisible
Спасибище !
setSelector, setSelected видел, а нужное проморгал. Да и искал обратное, что-то вроде setFirst, setVisible
Спасибище !