AsyncQueryHandler使用及原理分析
2018-11-01 本文已影响0人
_Once1
AsyncQueryHandler
在工作中遇到这个类,以前没有用过,在这里记录一下对它的简单分析
先看官方注释:
/**
* A helper class to help make handling asynchronous {@link ContentResolver}
* queries easier.
*/
一个可以帮助我们快速处理ContentResolver查询的帮助类
该类继承自handler,复写了handleMessage()方法
使用:
- 该类是一个抽象类,在使用时,需要继承它,然后实现相关的增删改方法,如onQueryComplete回调;
- 在需要的地方new一个其对象,然后调用增删改等方法
- 当任务执行结束时,会将查询完毕的cursor回调回来
下面来看看它内部是怎么实现任务完成及线程切换的
原理分析
构造方法:
构造方法.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:
image.png
拿到传入的cursor等参数,切换至主线程,回调onQueryComplete等方法,这样就将结果回调给了我们的实现
总结:通过使用两个handler:一个我们继承实现的handler_1,和另一个在子线程中创建的handler_2,
调用流程为:
handler_1.startQuery()---> 发送消息给handler_2----> handler_2.handleMsg---> 查询 ---> 发送消息给handler_1 --->
回调onQueryComplete() ---> 结束