我为ExpandableListView实现了一个自定义适配器,我从CursorTreeAdapter类扩展了它。一切都按预期工作。
但我想知道是否有关于如何在适配器类的getChildrenCursor()方法中异步查询数据库的模式或某种最佳实践。目前我正在将SQLiteOpenHelper类传递给我的适配器的构造函数,并在getChildrenCursor()中使用它在UI线程上同步查询数据库。
答案 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)
如果要异步查询 提供商阻止阻止UI, 可以返回null和a 以后调用setChildrenCursor(int, 光标)。
因此,在getChildrenCursor()
中,启动AsyncTask
并返回null。在onPostExecute()
方法调用setChildrenCursor()