【问题标题】:Crash while scrolling a cursor backed listview滚动光标支持的列表视图时崩溃
【发布时间】:2015-05-09 17:02:22
【问题描述】:

正如标题所说,我有一个列表视图,其中填充了光标适配器。比如说,我可以很好地滚动列表的前 50 个元素,但是如果我尝试进一步滚动它会崩溃,并且它总是在同一点崩溃。我包括了堆栈跟踪,但它对我来说并不是很有用:所有调用都是在 android 框架内进行的,所以即使我知道问题是最后一个封闭的数据库,我也不知道是哪一部分我的代码是问题所在。在同一个应用程序中,我还有其他基于游标的列表视图,它们不会造成任何问题。我对这个原因没有任何其他想法。

java.lang.IllegalStateException: The database '/storage/emulated/0/***/db/***.sqlite' is not open.
        at android.database.sqlite.SQLiteDatabase.throwIfNotOpenLocked(SQLiteDatabase.java:2169)
        at android.database.sqlite.SQLiteDatabase.createSession(SQLiteDatabase.java:365)
        at android.database.sqlite.SQLiteDatabase$1.initialValue(SQLiteDatabase.java:84)
        at android.database.sqlite.SQLiteDatabase$1.initialValue(SQLiteDatabase.java:81)
        at java.lang.ThreadLocal$Values.getAfterMiss(ThreadLocal.java:430)
        at java.lang.ThreadLocal.get(ThreadLocal.java:65)
        at android.database.sqlite.SQLiteDatabase.getThreadSession(SQLiteDatabase.java:359)
        at android.database.sqlite.SQLiteProgram.getSession(SQLiteProgram.java:101)
        at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
        at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:152)
        at android.database.sqlite.SQLiteCursor.onMove(SQLiteCursor.java:124)
        at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:214)
        at android.database.CursorWrapper.moveToPosition(CursorWrapper.java:162)
        at android.widget.CursorAdapter.getItemId(CursorAdapter.java:223)
        at android.widget.AbsListView$RecycleBin.retrieveFromScrap(AbsListView.java:6753)
        at android.widget.AbsListView$RecycleBin.getScrapView(AbsListView.java:6492)
        at android.widget.AbsListView.obtainView(AbsListView.java:2343)
        at android.widget.ListView.makeAndAddView(ListView.java:1864)
        at android.widget.ListView.fillDown(ListView.java:698)
        at android.widget.ListView.fillGap(ListView.java:662)
        at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4968)
        at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:4512)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
        at android.view.Choreographer.doCallbacks(Choreographer.java:580)
        at android.view.Choreographer.doFrame(Choreographer.java:549)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

【问题讨论】:

  • 日志说你的数据库已经关闭,你调用close()方法了吗?
  • 不是故意的。游标是从对内容提供者的调用中返回的。内容提供者使用原始查询检索游标到数据库。检索游标后关闭数据库。但是我对其他列表视图做同样的事情,它没有给任何问题。
  • 这是因为其他游标更小,它们适合一个名为 CursorWindow 的缓冲区
  • 非常感谢,确实删除了 contentprovider 中的 close 调用解决了这个问题。但是我现在必须重构代码并找到何时关闭数据库。你有这种模式的任何来源,或者关于这个光标窗口的东西吗? (即,使用游标适配器关闭数据库)还是在模型中加载整个数据库并使用基本适配器更好?不过恐怕会占用太多内存。另外,如果您做出回答,我会将其标记为已接受(即使仅针对 close() 删除建议)
  • 发现问题:stackoverflow.com/questions/4547461/… 显然,没有必要在内容提供者中调用 close,但是文档在这个意义上有点缺乏。

标签: android android-listview android-cursoradapter


【解决方案1】:

您已经关闭了数据库,并且 SQLiteCursor 需要在滚动 ListView 时填充其窗口,请参阅此处https://groups.google.com/forum/#!msg/android-developers/NwDRpHUXt0U/jIam4Q8-cqQJ 关于何时应该关闭数据库,答案是:没有必要这样做

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    相关资源
    最近更新 更多