1

我的主要活动(比如 A)提出了从 ContactsContract 获取 ContactID 的意图

startActivityForResult(new Intent(Intent.ACTION_PICK, contactsContract.Contacts.CONTENT_URI),PICK_CONTACT);

返回(onActivityResult(int reqCode,int resultCode,Intent data))时,我正在使用“数据”中的详细信息来查询联系人

 if (resultCode == Activity.RESULT_OK) {
        Uri contactData = data.getData();
        Cursor c =  managedQuery(contactData, null, null, null, null);
        ......

我的代码适用于 Android 2.x。但是,此代码在 ICS (Android 4.x) 中崩溃,同时恢复主 Activity(A)。我不确定是否是由于已弃用的“managedQuery”。有人可以提供一些解决方案吗,我被卡住了,甚至无法找到导致错误的行,因为 Log cat 甚至没有显示错误行号。它只是说 原因:android.database.StaleDataException:试图在游标关闭后访问它。 提前谢谢乔希

在完成游标的要求后,我已经尝试了上面的代码。问题仍然存在。我的日志猫说如下

08-13 00:26:31.427: W/dalvikvm(3176): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
08-13 00:26:31.447: E/AndroidRuntime(3176): FATAL EXCEPTION: main
08-13 00:26:31.447: E/AndroidRuntime(3176): java.lang.RuntimeException: Unable to resume activity {com.desquare.sp/com.desquare.sp.SmartPadActivity}: android.database.StaleDataException: Attempted to access a cursor after it has been closed.
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2444)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2472)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1173)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.os.Looper.loop(Looper.java:137)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.app.ActivityThread.main(ActivityThread.java:4424)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at java.lang.reflect.Method.invokeNative(Native Method)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at java.lang.reflect.Method.invoke(Method.java:511)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at dalvik.system.NativeStart.main(Native Method)
08-13 00:26:31.447: E/AndroidRuntime(3176): Caused by: android.database.StaleDataException: Attempted to access a cursor after it has been closed.
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.database.BulkCursorToCursorAdaptor.throwIfCursorIsClosed(BulkCursorToCursorAdaptor.java:75)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.database.BulkCursorToCursorAdaptor.requery(BulkCursorToCursorAdaptor.java:144)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.database.CursorWrapper.requery(CursorWrapper.java:186)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.app.Activity.performRestart(Activity.java:4505)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.app.Activity.performResume(Activity.java:4531)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2434)
08-13 00:26:31.447: E/AndroidRuntime(3176):     ... 10 more
4

2 回答 2

6

听起来这是个问题:

* android.database.staledataexception : 访问关闭游标

您似乎正在使用 managedQuery 获取游标。

我在恢复应用程序时遇到了问题,由于某种原因,Icecream Sandwich 中的应用程序没有正确关闭游标。修复方法是在使用所有游标后立即对它们执行此操作:

if (cursor != null && !cursor.isClosed()) {  
  myActivity.stopManagingCursor( cursor );   
  cursor.close(); 
}
于 2012-08-11T19:39:20.027 回答
0

API startManagingCursor/stopManagingCursor 已弃用,是问题的根本原因。例如,请将此注释掉并验证。

于 2015-07-20T14:08:09.570 回答