Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 蜂窝和游标(受挫)_Android_Cursor_Android 3.0 Honeycomb - Fatal编程技术网

Android 蜂窝和游标(受挫)

Android 蜂窝和游标(受挫),android,cursor,android-3.0-honeycomb,Android,Cursor,Android 3.0 Honeycomb,我的这项活动已经完全转变为使用蜂巢。我重新修改了所有游标管理,以使用新的游标加载程序。在所有其他操作系统版本上(使用兼容性库),一切都很好,但在蜂巢上仍然不起作用。下面的堆栈跟踪非常难以理解,因为它没有告诉我哪一个游标或哪一行失败。此外,调试时,不会执行ParentActivity中的任何代码行。当我恢复ParentActivity时发生此错误。当我开始活动时效果很好,但返回活动时失败 05-29 17:23:32.978: ERROR/AndroidRuntime(31692): FATAL

我的这项活动已经完全转变为使用蜂巢。我重新修改了所有游标管理,以使用新的游标加载程序。在所有其他操作系统版本上(使用兼容性库),一切都很好,但在蜂巢上仍然不起作用。下面的堆栈跟踪非常难以理解,因为它没有告诉我哪一个游标或哪一行失败。此外,调试时,不会执行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

这是在蜂巢中对游标管理方式所做的一些更改的结果。以前,如果您多次调用
startManagingCursor
所有操作都继续正常工作,现在会导致
IllegalStateException
,因为活动正在尝试重新查询关闭的光标。解决方案是在再次调用
startManagingCursor
之前关闭旧游标(就像在交换游标时一样)

因此,作为
活动
中托管游标生命周期的结果,您的
父活动
正在间接地执行此操作

现在您提到您正在使用ACL和游标加载程序,请确保在更改游标时正在调用,这将解决您的问题


你可以在这里看到一些关于这个问题的讨论:

我遇到了同样的问题。这就是我所做的。在我称之为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);
    }
}
@覆盖
公共无效开始管理游标(游标c){
//要解决蜂窝的以下错误:
//java.lang.RuntimeException:无法恢复活动
//java.lang.IllegalStateException:尝试重新查询已关闭的游标
if(Build.VERSION.SDK_INT

这使我的应用程序能够在蜂巢和早期版本上正确运行。

我也遇到了同样的问题,我想我可能已经找到了问题并找到了“干净”的解决方案。(我认为完全停止管理游标不是一个好主意)

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

因此,我的解决方案是:

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

到目前为止,我无法再次复制该异常。

您的回答让我有些困惑,因为我没有真正交换任何游标,但我确实发现我仍在使用StartMagingCursor,我删除了这些行,现在大家都很高兴。我真的很感谢你花时间回复我,并为我指明了正确的方向。非常感谢@Michael Little没问题,我只是想涵盖我所有的基础,因为它们是解决同一问题的几种方法。很高兴我能帮助您更好地摆脱startManagingCursor,在您的活动中创建mCursor。在onPause或onDestroy中关闭它(取决于您是在onResume还是onCreate中填充它)。删除startManagingCursor也解决了这个问题。当使用managedQuery时,我不得不在蜂巢中调用stopManagingCursor。嘿,也许是个愚蠢的问题,但是什么是
VersionUtil
?我无法导入它。它是我的内部类,指定了蜂巢版本
公共类版本直到{…public static final int蜂巢=11;..}
在哪里执行此操作,在onPause中?也许你的问题和我的不同。我从来没有在第一个地方改变光标,但我仍然会得到错误。我在我改变光标的地方做。也许你的问题和我的不同。