AsyncQueryHandler使用及原理分析

AsyncQueryHandler
在工作中遇到这个类,以前没有用过,在这里记录一下对它的简单分析


先看官方注释:

/**
 * A helper class to help make handling asynchronous {@link ContentResolver}
 * queries easier.
 */

一个可以帮助我们快速处理ContentResolver查询的帮助类
该类继承自handler,复写了handleMessage()方法

使用:

  1. 该类是一个抽象类,在使用时,需要继承它,然后实现相关的增删改方法,如onQueryComplete回调;
  2. 在需要的地方new一个其对象,然后调用增删改等方法
  3. 当任务执行结束时,会将查询完毕的cursor回调回来

下面来看看它内部是怎么实现任务完成及线程切换的

原理分析
构造方法:


AsyncQueryHandler使用及原理分析_第1张图片
构造方法.png

使用WeakReference弱引用保存传入的ContentResolver对象;
然后 创建新的子线程HandlerThread,并用其创建一个WorkerHandler对象

下面看WorkerHandler的实现,主要是其handleMessage方法

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;

        WorkerArgs args = (WorkerArgs) msg.obj;

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

        switch (event) {
        ...
        }

        // 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();
    }
}

通过解析message中传入的参数,调用resolver对应的增删改查方法,然后,通过向自身发送消息,将查询后的cursor发给自己的handleMessage方法(注意,此时已经将结果从子线程切换到了主线程,因为自身handler是在主线程创建的:也就是用我们实现的子类而创建的对象

AsyncQueryHandler的handleMessage:


AsyncQueryHandler使用及原理分析_第2张图片
image.png

拿到传入的cursor等参数,切换至主线程,回调onQueryComplete等方法,这样就将结果回调给了我们的实现


总结:通过使用两个handler:一个我们继承实现的handler_1,和另一个在子线程中创建的handler_2,
调用流程为:

handler_1.startQuery()---> 发送消息给handler_2----> handler_2.handleMsg---> 查询 ---> 发送消息给handler_1 --->
回调onQueryComplete() ---> 结束

你可能感兴趣的:(AsyncQueryHandler使用及原理分析)