线程(AsyncQueryhandler)

来源:互联网 发布:阿里云免费邮箱入口 编辑:程序博客网 时间:2024/05/18 03:13

AsyncQueryhandler是一个异步并在新线程中操作数据库的一个封装类,一般与ComtentProvider配合使用。

首先,我们先分析下AsyncQueryhandler的工作原理:

AsyncQueryhandler它是一个基础Handler的虚类。

它的主要参数有:

WorkerArgs类:保存当前Hander对象和查询内容

WorkerHandler继承Handler:handlerMessage实现查询过程

startQuery、startInsert、startDelete、startUpdate查询函数

onQueryComplete、onInsertComplete等与查询函数对应的函数

handlerMessage方法

实现原理:

AsyncQueryhandler中有两个handlerMessage,一个是基于外部线程looper的,一个是基于内部WorkerHandler实现的HandlerThread

新线程的looper。外部调用startQuery会通过mWorkerThreadHandler.sendMessage(msg)将查询发送给WorkerHandler中处理,即在

新线程中查询,当WorkerHandler处理完后,把结果发送给AsyncQueryhandler的handlerMessage来调用对应的onXXXComplete函数。

这里就是把查询结果返回给原来线程来处理,这就通过两个handlerMessage实现了两个线程的消息交互。


具体代码实现过程描述:

    public void startQuery(int token, Object cookie, Uri uri,
            String[] projection, String selection, String[] selectionArgs,
            String orderBy) {
        // Use the token as what so cancelOperations works properly
        Message msg = mWorkerThreadHandler.obtainMessage(token);
        msg.arg1 = EVENT_ARG_QUERY;

//这里注意args.handler = this;这个是保存AsyncQueryhandler中的handler,提供给WorkerHandler处理完消息后通知AsyncQueryhandler中

//的handlerMessage
        WorkerArgs args = new WorkerArgs();
        args.handler = this;
        args.uri = uri;
        args.projection = projection;
        args.selection = selection;
        args.selectionArgs = selectionArgs;
        args.orderBy = orderBy;
        args.cookie = cookie;
        msg.obj = args;


        mWorkerThreadHandler.sendMessage(msg);
    }

    protected class WorkerHandler extends Handler {
        public WorkerHandler(Looper looper) {
            super(looper);
        }


        @Override
        public void handleMessage(Message msg) {
            final ContentResolver resolver = mResolver.get();
            if (resolver == null) return;

//这里就有刚才保存的那个handler
            WorkerArgs args = (WorkerArgs) msg.obj;


            int token = msg.what;
            int event = msg.arg1;


            switch (event) {

                case EVENT_ARG_INSERT:
                    args.result = resolver.insert(args.uri, args.values);
                    break;

}

            // passing the original token value back to the caller
            // on top of the event values in arg1.
            Message reply = args.handler.obtainMessage(token);
            reply.obj = args;
            reply.arg1 = msg.arg1;

            reply.sendToTarget();

}

    public void handleMessage(Message msg) {
        WorkerArgs args = (WorkerArgs) msg.obj;

        int token = msg.what;
        int event = msg.arg1;


        // pass token back to caller on each callback.
        switch (event) {
            case EVENT_ARG_QUERY:
                onQueryComplete(token, args.cookie, (Cursor) args.result);
                break;

}

}


我们知道原理后就要去熟悉怎么使用了:

private static class QueryHandler extends AsyncQueryHandler {

//实现构造函数等其他操作

        @Override
        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {

//实现对应操作完数据库后的函数

}

}

mQueryHandler = new QueryHandler(this);

mQueryHandler.cancelOperation(QUERY_TOKEN);

mQueryHandler.startQuery(QUERY_TOKEN, null, uri, projection, null, null,
                        People.DISPLAY_NAME);


原创粉丝点击