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);                }            }        }
原创粉丝点击