Страница 1 из 1

Поворот экрана, ListView+Cursor

Добавлено: 19 фев 2013, 18:54
Roger68
День добрый!

Самый обычный 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

Добавлено: 19 фев 2013, 19:16
rezak90
всё просто, в паузе нужно закрывать соединение и курсор, при резуме открывать... если не хотите этого то запрещайте поворот экрана.

Re: Поворот экрана, ListView+Cursor

Добавлено: 19 фев 2013, 20:35
Roger68
Пробовал. Если до поворота я был в конце списка, после поворота оказываюсь в начале

Re: Поворот экрана, ListView+Cursor

Добавлено: 19 фев 2013, 20:49
rezak90
что пробывали? если в паузе закрыть а в резуме открыть то конечно вначале будете, или сохраняйте состояние листа или запрещайте поворот экрана

Re: Поворот экрана, ListView+Cursor

Добавлено: 19 фев 2013, 21:11
Roger68
rezak90 писал(а):сохраняйте состояние листа
вот-вот, можно по-подробнее ?
а то нашел только int ListView.getFirstVisiblePosition(), а это только половина дела.

Сам view прекрасно восстанавливается автоматически, даже при возникновении ошибки, причем вместе с коннектом и курсором.

Re: Поворот экрана, ListView+Cursor

Добавлено: 20 фев 2013, 00:54
rezak90
и чем же getFirstVisiblePosition() не подходит? возвращает позицию сверху, в резуме делаем setSelection и всё

Re: Поворот экрана, ListView+Cursor

Добавлено: 20 фев 2013, 11:39
Roger68
О, стыд-то какой (
setSelector, setSelected видел, а нужное проморгал. Да и искал обратное, что-то вроде setFirst, setVisible
Спасибище !