Android兼容性库CursorLoader:java.lang.IllegalStateException:游标已关闭

前端之家收集整理的这篇文章主要介绍了Android兼容性库CursorLoader:java.lang.IllegalStateException:游标已关闭前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前正在使用 Android兼容性库中的片段内的CursorLoader.
几乎每次,在Droid 2(我无法在Nexus One或Sensation上重现),似乎游标正在关闭太快,这是导致各种错误.不幸的是,我的代码中没有任何帮助的痕迹(因为问题是为什么Cursor被关闭,而不是Android通知),所以我真的很想弄清楚出了什么问题.有其他人遇到这个问题吗? (或有想法可能发生).

一些堆栈跟踪:

  1. java.lang.IllegalStateException: Cursor is closed
  2. at android.database.sqlite.sqliteCursor.fillWindow(sqliteCursor.java:278)
  3. at android.database.sqlite.sqliteCursor.onMove(sqliteCursor.java:255)
  4. at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:187)
  5. at android.database.CursorWrapper.moveToPosition(CursorWrapper.java:187)
  6. at android.support.v4.widget.CursorAdapter.getItemId(CursorAdapter.java:226)
  7. at android.widget.AbsListView$PerformClick.run(AbsListView.java:1721)
  8. at android.os.Handler.handleCallback(Handler.java:587)
  9. at android.os.Handler.dispatchMessage(Handler.java:92)
  10. at android.os.Looper.loop(Looper.java:143)
  11. at android.app.ActivityThread.main(ActivityThread.java:4717)
  12. at java.lang.reflect.Method.invokeNative(Native Method)
  13. at java.lang.reflect.Method.invoke(Method.java:521)
  14. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
  15. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
  16. at dalvik.system.NativeStart.main(Native Method)
  17.  
  18. java.lang.IllegalStateException: Cursor is closed
  19. at android.database.sqlite.sqliteCursor.fillWindow(sqliteCursor.java:278)
  20. at android.database.sqlite.sqliteCursor.onMove(sqliteCursor.java:255)
  21. at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:187)
  22. at android.database.CursorWrapper.moveToPosition(CursorWrapper.java:187)
  23. at android.support.v4.widget.CursorAdapter.getItemId(CursorAdapter.java:226)
  24. at android.widget.AdapterView.getItemIdAtPosition(AdapterView.java:745)
  25. at android.widget.AdapterView.setSelectedPositionInt(AdapterView.java:1081)
  26. at android.widget.AbsListView.onTouchEvent(AbsListView.java:2207)
  27. at android.widget.ListView.onTouchEvent(ListView.java:3377)
  28. at android.view.View.dispatchTouchEvent(View.java:3766)
  29. at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:897)
  30. at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
  31. at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
  32. at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
  33. at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
  34. at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
  35. at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1800)
  36. at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1140)
  37. at android.app.Activity.dispatchTouchEvent(Activity.java:2105)
  38. at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1784)
  39. at android.view.ViewRoot.handleMessage(ViewRoot.java:1794)
  40. at android.os.Handler.dispatchMessage(Handler.java:99)
  41. at android.os.Looper.loop(Looper.java:143)
  42. at android.app.ActivityThread.main(ActivityThread.java:4717)
  43. at java.lang.reflect.Method.invokeNative(Native Method)
  44. at java.lang.reflect.Method.invoke(Method.java:521)
  45. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
  46. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
  47. at dalvik.system.NativeStart.main(Native Method)
  48.  
  49. java.lang.RuntimeException: Unable to pause activity : java.lang.IllegalStateException: Cursor is closed
  50. at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3438)
  51. at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3395)
  52. at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3378)
  53. at android.app.ActivityThread.access$2700(ActivityThread.java:129)
  54. at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2124)
  55. at android.os.Handler.dispatchMessage(Handler.java:99)
  56. at android.os.Looper.loop(Looper.java:143)
  57. at android.app.ActivityThread.main(ActivityThread.java:4717)
  58. at java.lang.reflect.Method.invokeNative(Native Method)
  59. at java.lang.reflect.Method.invoke(Method.java:521)
  60. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
  61. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
  62. at dalvik.system.NativeStart.main(Native Method)
  63. Caused by: java.lang.IllegalStateException: Cursor is closed
  64. at android.database.sqlite.sqliteCursor.fillWindow(sqliteCursor.java:278)
  65. at android.database.sqlite.sqliteCursor.onMove(sqliteCursor.java:255)
  66. at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:187)
  67. at android.database.CursorWrapper.moveToPosition(CursorWrapper.java:187)
  68. at android.support.v4.widget.CursorAdapter.getItemId(CursorAdapter.java:226)
  69. at android.widget.AbsListView.onSaveInstanceState(AbsListView.java:910)
  70. at android.widget.ListView.onSaveInstanceState(ListView.java:3687)
  71. at android.view.View.dispatchSaveInstanceState(View.java:6070)
  72. at android.view.ViewGroup.dispatchFreezeSelfOnly(ViewGroup.java:1197)
  73. at android.widget.AdapterView.dispatchSaveInstanceState(AdapterView.java:759)
  74. at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:1184)
  75. at android.view.View.saveHierarchyState(View.java:6053)
  76. at android.support.v4.app.FragmentManagerImpl.saveFragmentViewState(FragmentManager.java:1387)
  77. at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1439)
  78. at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:468)
  79. at android.app.Activity.performSaveInstanceState(Activity.java:1040)
  80. at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1180)
  81. at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3420)
  82. ... 12 more

而对于好的措施,至少在我的代码中有一行:

  1. android.database.StaleDataException: Access closed cursor
  2. at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:217)
  3. at android.database.AbstractWindowedCursor.getBlob(AbstractWindowedCursor.java:27)
  4. at android.database.CursorWrapper.getBlob(CursorWrapper.java:143)
  5. at android.database.CursorWrapper.getBlob(CursorWrapper.java:143)
  6. at com.testapp.TestFragment$1.setViewValue(TestFragment.java:84)
  7. at android.support.v4.widget.SimpleCursorAdapter.bindView(SimpleCursorAdapter.java:131)
  8. at android.support.v4.widget.CursorAdapter.getView(CursorAdapter.java:257)
  9. at android.widget.AbsListView.obtainView(AbsListView.java:1319)
  10. at android.widget.ListView.makeAndAddView(ListView.java:1789)
  11. at android.widget.ListView.fillDown(ListView.java:656)
  12. at android.widget.ListView.fillSpecific(ListView.java:1342)
  13. at android.widget.ListView.layoutChildren(ListView.java:1616)
  14. at android.widget.AbsListView.onLayout(AbsListView.java:1172)
  15. at android.view.View.layout(View.java:7037)
  16. at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
  17. at android.view.View.layout(View.java:7037)
  18. at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
  19. at android.view.View.layout(View.java:7037)
  20. at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
  21. at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)
  22. at android.widget.LinearLayout.onLayout(LinearLayout.java:1042)
  23. at android.view.View.layout(View.java:7037)
  24. at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
  25. at android.view.View.layout(View.java:7037)
  26. at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
  27. at android.view.View.layout(View.java:7037)
  28. at android.view.ViewRoot.performTraversals(ViewRoot.java:1054)
  29. at android.view.ViewRoot.handleMessage(ViewRoot.java:1736)
  30. at android.os.Handler.dispatchMessage(Handler.java:99)
  31. at android.os.Looper.loop(Looper.java:143)
  32. at android.app.ActivityThread.main(ActivityThread.java:4717)
  33. at java.lang.reflect.Method.invokeNative(Native Method)
  34. at java.lang.reflect.Method.invoke(Method.java:521)
  35. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
  36. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
  37. at dalvik.system.NativeStart.main(Native Method)

更新:修正,请看下面我的答案

解决方法

我没有提示问题是什么,但也许这可以帮助你固定下来.

创建一个这样的LoggedCursor并设置光标工厂,这样你的查询就可以给你LoggedCursor:

  1. class LoggedCursor extends sqliteCursor {
  2. @Override
  3. public void close() {
  4. Log.d(TAG,"Cursor closed by:",new RuntimeException("Stack trace"));
  5. super.close();
  6. }
  7. }

RuntimeException只是为了轻松记录堆栈跟踪,而不是抛出它.当光标关闭时,您将看到日志中的跟踪.

希望这有助于弄清楚什么时候和由谁关闭.

猜你在找的Android相关文章