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

Android 在CursorTreeAdapter类的getChildrenCursor()方法中异步查询数据库的模式,android,asynchronous,expandablelistadapter,Android,Asynchronous,Expandablelistadapter,我已经为ExpandableListView实现了一个自定义适配器,我从类中扩展了它。一切正常 但是我想知道在adapter类的方法中是否有关于如何异步查询数据库的模式或某种最佳实践。目前,我正在将SQLiteOpenHelper类传递给适配器的构造函数,并在UI线程上使用它同步查询数据库 说: 如果要异步查询 提供程序,以防止阻止UI, 可以返回null,并在 稍后调用setChildrenCursor(int, 光标) 因此,在getChildrenCursor()中,启动一个AsyncTa

我已经为ExpandableListView实现了一个自定义适配器,我从类中扩展了它。一切正常

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

说:

如果要异步查询 提供程序,以防止阻止UI, 可以返回null,并在 稍后调用setChildrenCursor(int, 光标)


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

中,您还可以使用
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);
    }
}

我在
onLoadFinished
中做了类似的事情,为什么要检查光标是否已关闭?或者,您可以查看以下文件:
ApiDemos/src/com/example/android/api/view/ExpandableList2.java
(在SDK示例中)。
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;
}