在CursorTreeAdapter类的getChildrenCursor()方法中异步查询数据库的模式

时间:2011-04-24 15:08:40

标签: android asynchronous expandablelistadapter

我为ExpandableListView实现了一个自定义适配器,我从CursorTreeAdapter类扩展了它。一切都按预期工作。

但我想知道是否有关于如何在适配器类的getChildrenCursor()方法中异步查询数据库的模式或某种最佳实践。目前我正在将SQLiteOpenHelper类传递给我的适配器的构造函数,并在getChildrenCursor()中使用它在UI线程上同步查询数据库。

2 个答案:

答案 0 :(得分:3)

您还可以使用CursorLoader而不是子类化AsyncTask来异步查询提供程序。

public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    if (id != -1) {
        // child cursor
        return new CursorLoader(getActivity(), childrenUri,
                CHILDREN_PROJECTION, selection, selectionArgs, sortOrder);
    } else {
        // group cursor
        return new CursorLoader(getActivity(), groupsUri,
                GROUPS_PROJECTION, selection, null, sortOrder);
    }

}

public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    int id = loader.getId();
    if (id != -1) {
        // child cursor
        if (!data.isClosed()) {
            try {
                mAdapter.setChildrenCursor(id, data);
            } catch (NullPointerException e) {
                Log.w("TAG",
                        "Adapter expired, try again on the next query: "
                                + e.getMessage());
            }
        }

    } else {
        // group cursor
        mAdapter.setGroupCursor(data);
    }
}

public void onLoaderReset(Loader<Cursor> loader) {
    int id = loader.getId();
    if (id != -1) {
        // child cursor
        mAdapter.setChildrenCursor(id, null);
    } else {
        // group cursor
        mAdapter.setGroupCursor(null);
    }
}

在适配器类中,您可以覆盖getChildrenCursor()方法,如下所示:

protected Cursor getChildrenCursor(Cursor groupCursor) {
    // Given the group, we return a cursor for all the children within that group
    int id = groupCursor.getInt(groupCursor
            .getColumnIndex(ContactsContract.Groups._ID));
    mActivity.getLoaderManager().initLoader(id, null,mFragment);
    return null;
}

答案 1 :(得分:1)

getChildrenCursor说:

  

如果要异步查询   提供商阻止阻止UI,   可以返回null和a   以后调用setChildrenCursor(int,   光标)。

因此,在getChildrenCursor()中,启动AsyncTask并返回null。在onPostExecute()方法调用setChildrenCursor()