如何异步运行FilterQueryProvider的查询?

时间:2011-10-08 18:17:31

标签: android listview asynchronous android-listview

我正在使用FilterQueryProvider来过滤由自定义CursorAdapter备份的列表视图的内容。

要使用FilterQueryProvider,您必须覆盖返回Cursor对象的runQuery()方法。现在我想知道如何异步查询游标以避免阻塞UI线程。

是否有某种最佳做法?我找不到任何关于runQuery()方法是在UI线程上还是在自己的线程上执行的信息。

2 个答案:

答案 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);
    }
};

来源:thisthis

答案 1 :(得分:0)

根据CursorAdapter documentation,您可以使用CursorAdapter#runQueryOnBackgroundThread