使用AsyncQueryHandler异步查询帮助类,可以实现数据库的增删改查(ContentProvidert提供的数据)。如果数据量较小的时候,使用一般的数据查询就可以实现。但是如果数据量较大,就会出现ANR(Application Not Responding)问题,这个时候你也可以使用Handler,但是这样会降低效率,这个时候我们就可以使用Android已经封装好的异步查询框架AsyncQueryHandler。
AsyncQueryHandler内部实现:AsyncQueryHandler类封装了调用者线程与工作线程的交互过程。交互的主体是两个Handler,一个运行在调用者线程中,一个运行在工作者线程中。创建AsyncQueryHandler对象,并通过提供onXXXComplete的回调接口,实现事件的完成处理。
Android API中提供了四个方法:
startInsert:插入
startDelete:删除
startUpdate:更新
startQuery:查询
四种方法,并有响应的onXXXComplete()方法与之相对应.于之相对应的4个onXXXComplete()方法都是空实现,因此我们完成相应调用后进行后续其他的操作可以在onXXXComplete()方法中完成.
使用方法
继承AsyncQueryHandler类,并提供onXXXComplete方法的实现(可以实现任何一个或多个,当然你也可以一个也不实现,如果你不关注操作数据库的結果),在你的实现中做一些对数据库操作完成的处理。
使用时直接调用startXXX方法即可。传入的通用参数如下:
token:一个令牌,主要用来标识查询,保证唯一即可.需要跟onXXXComplete方法传入的一致。(当然你也可以不一致,同样在数据库的操作结束后会调用对应的onXXXComplete方法 )
cookie:你想传给onXXXComplete方法使用的一个对象。(没有的话传递null即可)
Uri uri(进行查询的通用资源标志符):
projection 查询的列
selection 限制条件
selectionArgs 查询参数
orderBy 排序条件
下面我们来看看一个用AsyncQueryHandler进行查询的例子:
//必须要有_id字段
final String[] from=new String[] { "_id","id" };
//数据库异步查询
new AsyncQueryHandler(getContentResolver()) {
protected void onQueryComplete(int token, Object cookie,
Cursor cursor) {
//TestAdapter是SimpleCursorAdapter的子类
TestAdapter adapter = new TestAdapter(MainActivity.this, cursor,
from);
listView.setAdapter(adapter);
listView.setSelection(adapter.getCount()-1);
};
}.startQuery(0, null, TestProvider.CONTENT_URI, from,
null, null, null);
上面“ 必须要有_id字段”,原因我在这里就不多说了,请参考我的另一篇博客: 点击打开链接 http://blog.csdn.net/u014544193/article/details/40976579。 TestProvider是ContentProvider的子类。
AsyncQueryHandler的介绍,到这里基本上就结束啦,希望对大家有所帮组!!!