2011-05-30 110 views
4

我有这个完全转换为使用蜂窝的活动。我重写了所有的游标管理以使用新的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

这是在Honeycomb中对如何管理游标进行的一些更改的效果。以前,如果您不止一次调用startManagingCursor,则所有事情都可以继续正常工作,现在它将导致IllegalStateException,因为该活动试图重新查找已关闭的游标。解决办法是在再次调用startManagingCursor之前关闭旧的光标(就像交换光标时一样)。

因此,您的ParentActivity正在通过Activity内托管游标生命周期的结果间接完成此操作。

现在你提到你正在使用ACL和CursorLoader,请确保在更改游标时调用swapCursor(Cursor c),这应该可以解决你的问题。

你可以看到一些这在这里讨论:http://groups.google.com/group/android-developers/browse_thread/thread/658133bec901d7e

+0

我对你的回应有些困惑,因为我没有真的交换任何游标,但是我发现我仍然在使用startManagingCursor,并且删除了这些行,现在都很开心。我非常感谢您花时间回复并指引我朝着正确的方向前进。感谢一堆! – 2011-05-30 01:05:13

+0

@迈克尔没什么问题,我只想覆盖我所有的基地,因为他们有几种方法可以解决同样的问题。很高兴能帮助 – smith324 2011-05-30 01:50:53

+0

更好地摆脱startManagingCursor,在您的活动中创建mCursor。在onPause或onDestroy中关闭它(取决于是否将它填充到onResume或onCreate中)。 – Yar 2012-06-19 11:45:40

11

我遇到了同样的问题。这是我所做的。在所有的,我已经叫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及更早版本。

+0

删除startManagingCursor也解决了我的问题。在使用managedQuery时,我必须在蜂窝中调用stopManagingCursor。 – anakin78z 2011-07-02 21:31:21

+4

但你必须手动关闭游标? – njzk2 2011-12-12 16:21:07

+0

非常好。它完美的作品。非常感谢 – Santhosh 2012-04-25 07:18:58

5

我有同样的问题,并认为我可能已经找到了问题和“干净”的修复。 (我认为停下来管理游标根本不是一个好主意)

我在一些活动中使用Adapter.changeCursor,这些活动在除了蜂窝以外的所有版本中工作得很好。 changeCursor方法关闭旧的游标,但显然不停止管理该游标。因此,该活动将继续管理已关闭的旧游标。在重新启动活动时,它会尝试重新查询它,而不检查它是否已关闭。

所以我的解决办法是:

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

到现在为止,我不能再重现例外。

+0

很好的解决方案,对我有用......谢谢 – 2011-10-15 07:37:14

+0

你在onPause上做了什么?也许你的问题与我的不同。我从来没有改变光标,但我仍然得到错误。 – Tenfour04 2011-11-01 02:05:29

+0

我在(曾经)改变光标的地方做。也许你的问题与我的不同。 – Maniac 2011-11-08 15:10:33