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

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Ответить
Roger68
Сообщения: 16
Зарегистрирован: 12 фев 2013, 23:43

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

Сообщение Roger68 » 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
Это глюк эмулятора ?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 19 фев 2013, 19:16

всё просто, в паузе нужно закрывать соединение и курсор, при резуме открывать... если не хотите этого то запрещайте поворот экрана.
R.id.team
Политика на форуме запрещена

Roger68
Сообщения: 16
Зарегистрирован: 12 фев 2013, 23:43

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

Сообщение Roger68 » 19 фев 2013, 20:35

Пробовал. Если до поворота я был в конце списка, после поворота оказываюсь в начале

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 19 фев 2013, 20:49

что пробывали? если в паузе закрыть а в резуме открыть то конечно вначале будете, или сохраняйте состояние листа или запрещайте поворот экрана
R.id.team
Политика на форуме запрещена

Roger68
Сообщения: 16
Зарегистрирован: 12 фев 2013, 23:43

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

Сообщение Roger68 » 19 фев 2013, 21:11

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

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 20 фев 2013, 00:54

и чем же getFirstVisiblePosition() не подходит? возвращает позицию сверху, в резуме делаем setSelection и всё
R.id.team
Политика на форуме запрещена

Roger68
Сообщения: 16
Зарегистрирован: 12 фев 2013, 23:43

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

Сообщение Roger68 » 20 фев 2013, 11:39

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

Ответить