应用程序崩溃在ICS中的Resume,同时在Gingerbread上完美运行

1 crash android android-4.0-ice-cream-sandwich

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

startActivityForResult(new Intent(Intent.ACTION_PICK, contactsContract.Contacts.CONTENT_URI),PICK_CONTACT);
Run Code Online (Sandbox Code Playgroud)

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

 if (resultCode == Activity.RESULT_OK) {
        Uri contactData = data.getData();
        Cursor c =  managedQuery(contactData, null, null, null, null);
        ......
Run Code Online (Sandbox Code Playgroud)

我的代码适用于Android 2.x. 但是,此代码在ICS(Android 4.x)中崩溃,同时恢复主Activity(A).我不确定,是否是由于被弃用的'managedQuery'.有人可以提供一些解决方案,我卡住甚至无法找到哪一行导致错误,因为Log cat甚至没有显示错误行号.它简单地说 由引起:android.database.StaleDataException:在游标关闭后尝试访问它. 在此先感谢Joshy

我在完成光标要求后尝试了上面的代码.问题仍然存在.我的Log cat说如下

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
Run Code Online (Sandbox Code Playgroud)

pau*_*sm4 6

听起来这是问题所在:

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

您似乎使用managedQuery获取游标.

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

if (cursor != null && !cursor.isClosed()) {  
  myActivity.stopManagingCursor( cursor );   
  cursor.close(); 
}
Run Code Online (Sandbox Code Playgroud)

  • 好的:问:你在任何地方使用startManagingCursor()(在2.2版本中弃用)吗?在任何地方明确地调用"cursor.close()"?在这里查看:http://code.google.com/p/android/issues/detail ?ID = 23746 (2认同)