我正在使用FilterQueryProvider来过滤由自定义CursorAdapter备份的列表视图的内容。
要使用FilterQueryProvider,您必须覆盖返回Cursor对象的runQuery()方法。现在我想知道如何异步查询游标以避免阻塞UI线程。
是否有某种最佳做法?我找不到任何关于runQuery()方法是在UI线程上还是在自己的线程上执行的信息。
答案 0 :(得分:3)
来自文档:
通过调用过滤器执行过滤操作(CharSequence, android.widget.Filter.FilterListener)是异步执行的
所以你的代码应该是这样的:
private void filterList(CharSequence constraint) {
final YourListCursorAdapter adapter =
(YourListCursorAdapter) getListAdapter();
final Cursor oldCursor = adapter.getCursor();
adapter.setFilterQueryProvider(filterQueryProvider);
adapter.getFilter().filter(constraint, new FilterListener() {
public void onFilterComplete(int count) {
// assuming your activity manages the Cursor
stopManagingCursor(oldCursor);
final Cursor newCursor = adapter.getCursor();
startManagingCursor(newCursor);
// safely close the oldCursor
if (oldCursor != null && !oldCursor.isClosed()) {
oldCursor.close();
}
}
});
}
private FilterQueryProvider filterQueryProvider = new FilterQueryProvider() {
public Cursor runQuery(CharSequence constraint) {
return dbHelper.getListCursor(constraint);
}
};
答案 1 :(得分:0)
根据CursorAdapter documentation,您可以使用CursorAdapter#runQueryOnBackgroundThread