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