Android Compatibility Library CursorLoader : java.lang.IllegalStateException: Cursor is closed -
i'm using cursorloader inside fragment android compatibility library. every time, on droid 2 (i'm unable reproduce on nexus 1 or sensation), seems cursors being closed soon, causing various errors. unfortunately traces don't point anywhere helpful in code (since issue why cursor being closed, not when android notices), i'm struggling figure out going wrong. has else encountered problem? (or have ideas might happening).
some stack traces:
java.lang.illegalstateexception: cursor closed @ android.database.sqlite.sqlitecursor.fillwindow(sqlitecursor.java:278) @ android.database.sqlite.sqlitecursor.onmove(sqlitecursor.java:255) @ android.database.abstractcursor.movetoposition(abstractcursor.java:187) @ android.database.cursorwrapper.movetoposition(cursorwrapper.java:187) @ android.support.v4.widget.cursoradapter.getitemid(cursoradapter.java:226) @ android.widget.abslistview$performclick.run(abslistview.java:1721) @ android.os.handler.handlecallback(handler.java:587) @ android.os.handler.dispatchmessage(handler.java:92) @ android.os.looper.loop(looper.java:143) @ android.app.activitythread.main(activitythread.java:4717) @ java.lang.reflect.method.invokenative(native method) @ java.lang.reflect.method.invoke(method.java:521) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:868) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:626) @ dalvik.system.nativestart.main(native method) java.lang.illegalstateexception: cursor closed @ android.database.sqlite.sqlitecursor.fillwindow(sqlitecursor.java:278) @ android.database.sqlite.sqlitecursor.onmove(sqlitecursor.java:255) @ android.database.abstractcursor.movetoposition(abstractcursor.java:187) @ android.database.cursorwrapper.movetoposition(cursorwrapper.java:187) @ android.support.v4.widget.cursoradapter.getitemid(cursoradapter.java:226) @ android.widget.adapterview.getitemidatposition(adapterview.java:745) @ android.widget.adapterview.setselectedpositionint(adapterview.java:1081) @ android.widget.abslistview.ontouchevent(abslistview.java:2207) @ android.widget.listview.ontouchevent(listview.java:3377) @ android.view.view.dispatchtouchevent(view.java:3766) @ android.view.viewgroup.dispatchtouchevent(viewgroup.java:897) @ android.view.viewgroup.dispatchtouchevent(viewgroup.java:936) @ android.view.viewgroup.dispatchtouchevent(viewgroup.java:936) @ android.view.viewgroup.dispatchtouchevent(viewgroup.java:936) @ android.view.viewgroup.dispatchtouchevent(viewgroup.java:936) @ android.view.viewgroup.dispatchtouchevent(viewgroup.java:936) @ com.android.internal.policy.impl.phonewindow$decorview.superdispatchtouchevent(phonewindow.java:1800) @ com.android.internal.policy.impl.phonewindow.superdispatchtouchevent(phonewindow.java:1140) @ android.app.activity.dispatchtouchevent(activity.java:2105) @ com.android.internal.policy.impl.phonewindow$decorview.dispatchtouchevent(phonewindow.java:1784) @ android.view.viewroot.handlemessage(viewroot.java:1794) @ android.os.handler.dispatchmessage(handler.java:99) @ android.os.looper.loop(looper.java:143) @ android.app.activitythread.main(activitythread.java:4717) @ java.lang.reflect.method.invokenative(native method) @ java.lang.reflect.method.invoke(method.java:521) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:868) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:626) @ dalvik.system.nativestart.main(native method) java.lang.runtimeexception: unable pause activity : java.lang.illegalstateexception: cursor closed @ android.app.activitythread.performpauseactivity(activitythread.java:3438) @ android.app.activitythread.performpauseactivity(activitythread.java:3395) @ android.app.activitythread.handlepauseactivity(activitythread.java:3378) @ android.app.activitythread.access$2700(activitythread.java:129) @ android.app.activitythread$h.handlemessage(activitythread.java:2124) @ android.os.handler.dispatchmessage(handler.java:99) @ android.os.looper.loop(looper.java:143) @ android.app.activitythread.main(activitythread.java:4717) @ java.lang.reflect.method.invokenative(native method) @ java.lang.reflect.method.invoke(method.java:521) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:868) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:626) @ dalvik.system.nativestart.main(native method) caused by: java.lang.illegalstateexception: cursor closed @ android.database.sqlite.sqlitecursor.fillwindow(sqlitecursor.java:278) @ android.database.sqlite.sqlitecursor.onmove(sqlitecursor.java:255) @ android.database.abstractcursor.movetoposition(abstractcursor.java:187) @ android.database.cursorwrapper.movetoposition(cursorwrapper.java:187) @ android.support.v4.widget.cursoradapter.getitemid(cursoradapter.java:226) @ android.widget.abslistview.onsaveinstancestate(abslistview.java:910) @ android.widget.listview.onsaveinstancestate(listview.java:3687) @ android.view.view.dispatchsaveinstancestate(view.java:6070) @ android.view.viewgroup.dispatchfreezeselfonly(viewgroup.java:1197) @ android.widget.adapterview.dispatchsaveinstancestate(adapterview.java:759) @ android.view.viewgroup.dispatchsaveinstancestate(viewgroup.java:1184) @ android.view.view.savehierarchystate(view.java:6053) @ android.support.v4.app.fragmentmanagerimpl.savefragmentviewstate(fragmentmanager.java:1387) @ android.support.v4.app.fragmentmanagerimpl.saveallstate(fragmentmanager.java:1439) @ android.support.v4.app.fragmentactivity.onsaveinstancestate(fragmentactivity.java:468) @ android.app.activity.performsaveinstancestate(activity.java:1040) @ android.app.instrumentation.callactivityonsaveinstancestate(instrumentation.java:1180) @ android.app.activitythread.performpauseactivity(activitythread.java:3420) ... 12 more
and measures, 1 @ least has single line in code:
android.database.staledataexception: access closed cursor @ android.database.abstractwindowedcursor.checkposition(abstractwindowedcursor.java:217) @ android.database.abstractwindowedcursor.getblob(abstractwindowedcursor.java:27) @ android.database.cursorwrapper.getblob(cursorwrapper.java:143) @ android.database.cursorwrapper.getblob(cursorwrapper.java:143) @ com.testapp.testfragment$1.setviewvalue(testfragment.java:84) @ android.support.v4.widget.simplecursoradapter.bindview(simplecursoradapter.java:131) @ android.support.v4.widget.cursoradapter.getview(cursoradapter.java:257) @ android.widget.abslistview.obtainview(abslistview.java:1319) @ android.widget.listview.makeandaddview(listview.java:1789) @ android.widget.listview.filldown(listview.java:656) @ android.widget.listview.fillspecific(listview.java:1342) @ android.widget.listview.layoutchildren(listview.java:1616) @ android.widget.abslistview.onlayout(abslistview.java:1172) @ android.view.view.layout(view.java:7037) @ android.widget.framelayout.onlayout(framelayout.java:333) @ android.view.view.layout(view.java:7037) @ android.widget.framelayout.onlayout(framelayout.java:333) @ android.view.view.layout(view.java:7037) @ android.widget.linearlayout.setchildframe(linearlayout.java:1249) @ android.widget.linearlayout.layoutvertical(linearlayout.java:1125) @ android.widget.linearlayout.onlayout(linearlayout.java:1042) @ android.view.view.layout(view.java:7037) @ android.widget.framelayout.onlayout(framelayout.java:333) @ android.view.view.layout(view.java:7037) @ android.widget.framelayout.onlayout(framelayout.java:333) @ android.view.view.layout(view.java:7037) @ android.view.viewroot.performtraversals(viewroot.java:1054) @ android.view.viewroot.handlemessage(viewroot.java:1736) @ android.os.handler.dispatchmessage(handler.java:99) @ android.os.looper.loop(looper.java:143) @ android.app.activitythread.main(activitythread.java:4717) @ java.lang.reflect.method.invokenative(native method) @ java.lang.reflect.method.invoke(method.java:521) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:868) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:626) @ dalvik.system.nativestart.main(native method)
update: fixed, see answer below
i have no cue problem is, maybe helps pinning down.
create loggedcursor
, setup cursor factory query gives loggedcursor:
class loggedcursor extends sqlitecursor { @override public void close() { log.d(tag, "cursor closed by:", new runtimeexception("stack trace")); super.close(); } }
the runtimeexception
created log stack trace easily, not throwing it. when cursor closed you'll see trace in logs.
hopefully, helps figuring out when , whom closed.
Comments
Post a Comment