AsyncQueryHandler的使用
来源:互联网 发布:2016淘宝盗图新规则 编辑:程序博客网 时间:2024/06/07 14:02
AsyncQueryHandler简介:
异步的查询操作帮助类,可以处理增删改(ContentProvider提供的数据)
使用AsyncQueryHandler的场景:
查询数据库,如果数据太多会造成主线程堵塞导致ANR,所以需要开启子线程,然后 用Handler将结果回传。而使用Android系统提供的AsyncQueryHandler方便的实现这个过程。
在一般的应用中可以使用ContentProvider去操作数据库。
这在数据量很小的时候是没有问题的,但是如果数据量大了,可能导致UI线程发生ANR异常(超过5秒)。
当然你也可以写个Handler去做这些操作,只是你每次使用ContentProvider时都要再写个Handler,必然降低了效率。
因此当数据量较大时,最好还是使用Android已经封装好的异步查询框架AsyncQueryHandler,优化我们的代码.
AsyncQueryHandler内部实现
AsyncQueryHandler类封装了两个线程的交互过程。它们是调用者线程与工作线程。这两个线程里都维护着一个handler,通过提供onXXXComplete的回调接口,实现事件的完成处理。
如果用户调用了:
startInsert,
startDelete,
startUpdate,
startQuery四种方法。
那么操作执行完成后就会调用对应的:onXXXComplete()方法。
我们只要实现这些方法的内容就好了。
比如我执行一个查询操作,调用了queryHandler.startQuery();方法,那么这个方法执行完成后就会调用onQueryComplete()方法,这个方法里的第三个参数就是查询结束后返回的Cursor。
class TrackQueryHandler extends AsyncQueryHandler { class QueryArgs { public Uri uri; public String[] projection; public String selection; public String[] selectionArgs; public String orderBy; } TrackQueryHandler(ContentResolver res) { super(res); } //查询 public Cursor doQuery(Uri uri, String[] projection, String selection, String[] selectionArgs, String orderBy, boolean async) { if (async) { // Get 100 results first, which is enough to allow the user // to start scrolling, // while still being very fast. Uri limituri = uri.buildUpon().appendQueryParameter("limit", "100").build(); QueryArgs args = new QueryArgs(); args.uri = uri; args.projection = projection; args.selection = selection; args.selectionArgs = selectionArgs; args.orderBy = orderBy; startQuery(0, args, limituri, projection, selection, selectionArgs, orderBy); return null; } return MusicUtils.query(mFragment.getActivity(), uri, projection, selection, selectionArgs, orderBy); } @Override protected void onQueryComplete(int token, Object cookie, Cursor cursor) { //在onQueryComplete里给adapter设置新的cursor mFragment.init(cursor, cookie != null); if (token == 0 && cookie != null && cursor != null && !cursor.isClosed() && cursor.getCount() >= 100) { QueryArgs args = (QueryArgs) cookie; startQuery(1, null, args.uri, args.projection, args.selection, args.selectionArgs, args.orderBy); } } }
- AsyncQueryHandler的使用
- AsyncQueryHandler的使用
- AsyncQueryHandler的使用
- AsyncQueryHandler的使用
- AsyncQueryHandler的使用
- AsyncQueryHandler的使用
- AsyncQueryHandler的使用
- AsyncQueryHandler的使用
- AsyncQueryHandler的解释和使用
- AsyncQueryHandler使用
- Android 异步查询框架AsyncQueryHandler的使用
- Android 异步查询框架AsyncQueryHandler的使用
- Android 异步查询框架AsyncQueryHandler的使用
- Android 异步查询框架AsyncQueryHandler的使用
- Android 异步查询框架AsyncQueryHandler的使用
- Android 异步查询框架AsyncQueryHandler的使用
- Android 异步查询框架AsyncQueryHandler的使用
- CursorAdapter和AsyncQueryHandler的简易使用
- Exception
- SEO 优化
- eclipse编辑器中,如何配置编译命令-lm,使math.h 和pow(a,b)函数生效——C语言学习笔记4
- 原型(prototype)
- HDU_P1421搬寝室
- AsyncQueryHandler的使用
- iOS中 Framework静态库的创建和使用遇到的那些坑 韩俊强的博客
- 大数据浪潮下_前端工程师眼中的完整数据链图
- Emgucv3.0的安装与配置
- mysql的各种存储引擎使用及介绍
- 性能测试名词.解释
- ubuntu 16.04 x64 root密码更改与ssh服务开启指引
- 设计模式
- 操作系统基础-1