【问题标题】:Using pagination with CursorLoader and MergeCursor closes old cursors使用带有 CursorLoader 和 MergeCursor 的分页关闭旧游标
【发布时间】:2016-04-22 02:02:39
【问题描述】:

正如标题所说,当尝试对由SimpleCursorAdapterCursorLoader 支持的ListView 进行分页时,旧游标正在关闭,因此会引发以下异常。前两页加载得很好(第一页没有使用MergeCursor,第二页是第一页使用MergeCursor)。我不会在任何光标上调用任何close()

有趣的是,在调试时,我看不到任何游标上的关闭标志被设置为真,因为它的价值。那可能是MergeCursor 的问题。如果你们有任何解决方案,请告诉我,我没有想法。

堆栈跟踪:

android.database.StaleDataException: Attempting to access a closed CursorWindow.Most probable cause: cursor is deactivated prior to calling this method.
    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:139)
    at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:74)

代码:

private List<Cursor> mCursorsList = new ArrayList<>();

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
                     int visibleItemCount, int totalItemCount)
{
    if (!isLoading && !isAllLoaded &&
            firstVisibleItem != 0 &&
            firstVisibleItem == totalItemCount - visibleItemCount)
        getActivity().getSupportLoaderManager().restartLoader(LOADER_ID, null, this);
}

@Override
public void onLoadFinished(Loader<Cursor> loader, final Cursor data)
{
        Cursor oldCursor = mCursorAdapter.getCursor();
        mCursorsList.add(data);
        if (oldCursor != null)
        {
            Cursor[] cursorArray = mCursorsList.toArray(new Cursor[mCursorsList.size()]);
            MergeCursor newCursor = new MergeCursor(cursorArray);
            mCursorAdapter.swapCursor(newCursor);
        }
        else // first cursor
        {
            mCursorAdapter.swapCursor(data);
        }
}

@Override
public void onLoaderReset(Loader<Cursor> loader)
{
}

【问题讨论】:

    标签: android loader simplecursoradapter android-cursor android-cursorloader


    【解决方案1】:

    这个问题的主要原因是CursorLoader管理内部游标,所以每当它需要打开一个新游标(例如新页面查询)时,它都会关闭旧游标。

    对于更简单的分页实现,不要使用偏移量进行查询,只需在每个页面上增加限制,以便新游标包含所有以前的页面。此外,正如 Ian Lake 在 Google+ 上建议的那样,有时您甚至不需要分页,尤其是在您进行复杂的连接或对数据进行排序时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-28
      • 2019-06-29
      • 2011-11-29
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      相关资源
      最近更新 更多