Как я могу заставить свой Курсор пережить изменение ориентации? - PullRequest
9 голосов
/ 25 января 2011

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

Курсор содержит около 13k + строк данных, отображаемых в ListView, и, таким образом, может занять довольно много времени.в то время как если бы я сделал запрос каждый раз, когда меняется конфигурация.В моем onRetainNonConfigurationInstance() я возвращаю свой Курсор и затем извлекаю его через getLastNonConfigurationInstance().

Однако мой восстановленный курсор, похоже, уже закрыт, и, таким образом, мой адаптер больше не может отображать список.Насколько я понимаю, курсор был закрыт, так как onDestroy() автоматически закрывает все курсоры.

Я сохраняю Курсор так:

@Override
public Object onRetainNonConfigurationInstance() {
    return myCursor;
}

И извлекаю его так:

myCursor = (Cursor)getLastNonConfigurationInstance();
if (myCursor == null) {
    // Do some stuff here (access DB, etc)
} else { // we are returning from configuration change
    // Feed the cursor to the adapter
}

Я вставляю трассировку стека, если кто-то хочет посмотреть на нее:

01-25 16:57:45.637: ERROR/AndroidRuntime(12976): android.database.StaleDataException: Access closed cursor
    01-25 16:57:45.637: ERROR/AndroidRuntime(12976):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:217)
    01-25 16:57:45.637: ERROR/AndroidRuntime(12976):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
    01-25 16:57:45.637: ERROR/AndroidRuntime(12976):     at com.test.sample.helper.DictionaryAdapter.bindView(DictionaryAdapter.java:35)
[........More ListView-related errors here..........]

Я прошел по коду и обнаружил, что до onRetainNonConfigurationInstance() курсор все еще открыт, но после прохождения через getLastNonConfigurationInstance() оно уже закрыто.

Как я могу заставить свой Курсор пережить изменение ориентации?Спасибо за помощь!

РЕДАКТИРОВАТЬ: Основываясь на ответе Ромена, я закомментировал все свои startManagingCursor() с.Я должен был соединить точки и подумать об этом!Как бы то ни было, мое приложение теперь выдерживает один оборот, но его возврат к исходной ориентации все равно приводит к сбою.Продолжая отладку, я сообщу вам, что я обнаружил.

EDIT2: Я думаю, что, возможно, нашел причину новых ошибок.Я реализовал FilterQueryProvider, который возвращает новый курсор.Я назначил результаты этого фильтра моему оригинальному Курсору.Кажется, работает до сих пор.

Ответы [ 2 ]

4 голосов
/ 25 января 2011

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

0 голосов
/ 25 января 2011

Просто добавьте этот атрибут в тег активности в файле с указанием

андроида: configChanges = "ориентация | keyboardHidden"

это разрешит это

нет необходимости реализовывать что-либо еще

:) Это помогло мне, хотя

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