Соты и курсоры (разочарование) - PullRequest
4 голосов
/ 30 мая 2011

У меня есть это действие, которое было полностью преобразовано в использование сот. Я переработал все управление курсором, чтобы использовать новый cursorLoader. Все отлично работает на всех других версиях ОС (с использованием библиотеки совместимости), но все еще не работает на сотовой. Следующая трассировка стека чрезвычайно трудна для понимания, потому что она не говорит мне, какой курсор или какая строка не работает. Кроме того, при отладке ни одна строка кода в ParentActivity никогда не выполняется. Эта ошибка происходит, когда я возобновляю ParentActivity. Прекрасно работает, когда я начинаю упражнение, но не могу вернуться к нему

05-29 17:23:32.978: ERROR/AndroidRuntime(31692): FATAL EXCEPTION: main
05-29 17:23:32.978: ERROR/AndroidRuntime(31692): java.lang.RuntimeException: Unable to resume activity {com.xxx.xxx/com.xxx.xxx.ParentActivity}: java.lang.IllegalStateException: trying to requery an already closed cursor
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2227)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2255)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1028)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at android.os.Looper.loop(Looper.java:132)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at android.app.ActivityThread.main(ActivityThread.java:4025)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at java.lang.reflect.Method.invokeNative(Native Method)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at java.lang.reflect.Method.invoke(Method.java:491)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at dalvik.system.NativeStart.main(Native Method)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692): Caused by: java.lang.IllegalStateException: trying to requery an already closed cursor
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at android.app.Activity.performRestart(Activity.java:4394)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at android.app.Activity.performResume(Activity.java:4420)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2217)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     ... 10 more

Ответы [ 3 ]

11 голосов
/ 10 июня 2011

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

@Override
public void startManagingCursor(Cursor c) {

    // To solve the following error for honeycomb:
    // java.lang.RuntimeException: Unable to resume activity 
    // java.lang.IllegalStateException: trying to requery an already closed cursor
    if (Build.VERSION.SDK_INT < VersionUtil.HONEYCOMB) {
        super.startManagingCursor(c);
    }
}

Это заставляет мое приложение корректно работать на Honeycomb и более ранних версиях.

5 голосов
/ 05 июля 2011

У меня были те же проблемы, и я думаю, что мог бы найти проблему и "чистое" решение (Я думаю, что вообще не стоит управлять курсорами)

Я использую Adapter.changeCursor в некоторых действиях, которые прекрасно работали во всех версиях, кроме сотовой. Метод changeCursor закрывает старый курсор, но, очевидно, не прекращает управлять этим курсором. Таким образом, действие продолжает управлять тем старым курсором, который уже закрыт. При перезапуске действия он пытается запросить его, не проверяя, закрыто ли оно.

Итак, мое решение:

Cursor oldCursor = mAdapter.getCursor();
mAdapter.changeCursor(newCursor);
stopManagingCursor(oldCursor);

До сих пор я не могу воспроизвести это исключение снова.

3 голосов
/ 30 мая 2011

Это влияние некоторых изменений, внесенных в Honeycomb в управление курсорами.Ранее, если вы вызывали startManagingCursor более одного раза, все продолжало нормально работать, теперь это вызовет IllegalStateException, поскольку действие пытается запросить закрытый курсор.Решение состоит в том, чтобы закрыть старый курсор перед повторным вызовом startManagingCursor (как при смене курсоров).

Таким образом, ваш ParentActivity делает это косвенно в результате жизненного цикла управляемого курсора внутри Activity.

Теперь вы упомянули, что использовали ACL и CursorLoader, убедитесь, что вы вызываете swapCursor (Курсор c) при изменении курсоров, и это должно исправить ваши проблемы.

Вынекоторые обсуждения этого можно посмотреть здесь: http://groups.google.com/group/android-developers/browse_thread/thread/658133bec901d7e

...