【问题标题】:Application crashes onResume in ICS while working perfect on Gingerbread在 Gingerbread 上完美运行时,应用程序在 ICS 中的 onResume 崩溃
【发布时间】:2012-08-11 19:32:21
【问题描述】:

我的主要活动(比如 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

【问题讨论】:

  • 请发布整个堆栈跟踪,以及该堆栈跟踪中引用的代码的特定方法,指出您的代码的哪些行是堆栈跟踪中提到的特定行。
  • 我已将整个堆栈跟踪放在上面。请注意没有提到我的方法。除了我的主要活动(SmartPadActivity)的名称。 @Raghav

标签: android crash android-4.0-ice-cream-sandwich


【解决方案1】:

听起来是这个问题:

* android.database.staledataexception : Access closed cursor

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

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

if (cursor != null && !cursor.isClosed()) {  
  myActivity.stopManagingCursor( cursor );   
  cursor.close(); 
}

【讨论】:

  • 刚刚完成游标的要求,我已经尝试了上面的代码。问题仍然存在。我的原木猫说如下
  • OK:问:你是否在任何地方使用 startManagingCursor()"(2.2 版已弃用)?在任何地方显式调用“cursor.close()”?看这里:code.google.com/p/android/issues/detail?id=23746
  • 亲爱的 Paulsm4, 非常感谢您的帮助。在所有 managedQuery 之后,我已经评论了 cursor.close() 调用。现在,我的应用程序在 Gingerbread 和 ICS 中都重新出现了。再次感谢您的帮助
  • 我也面临同样的问题,请检查:stackoverflow.com/questions/36589345/…
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    相关资源
    最近更新 更多