AsyncQueryHandler是一个继承了handler的抽象类,声明如下:
public abstract class AsyncQueryHandler extends Handler{}
一、内容介绍
两个内部类
WorkerArgs和WorkerHandler。
1 WorkerArgs里声明了AsyncQueryHandler执行查询等方法时需要的参数
protected static final class WorkerArgs {
public Uri uri;
public Handler handler;
public String[] projection;
public String selection;
public String[] selectionArgs;
public String orderBy;
public Object result;
public Object cookie;
public ContentValues values;
}
2 WorkerHandler继承handler类,作为AsyncQueryHandler内部维护的handler,执行增删改查等访问数据库操作。声明如下:
protected class WorkerHandler extends Handler {}
九个全局变量
1 四个整数常量用来区分增删改查操作
private static final int EVENT_ARG_QUERY = 1;
private static final int EVENT_ARG_INSERT = 2;
private static final int EVENT_ARG_UPDATE = 3;
private static final int EVENT_ARG_DELETE = 4;
2 其他5个分别是ContentResolver的弱引用,一个handler、一个looper以及两个log标示。
final WeakReference<ContentResolver> mResolver;
private static Looper sLooper = null;
private Handler mWorkerThreadHandler;
private static final String TAG = "AsyncQuery";
private static final boolean localLOGV = false;
八个主要方法,对应增删改查和他们的完成回调
二、工作流程
首先于构造方法中初始化mResolver,并新建子线程,获取其消息循环looper赋给slooper,以此slooper创建WorkerHandler实例:mWorkerThreadHandler。
而后,当需要执行增删改查操作时,我们会调用其对应的start方法,传入适当的参数。在start方法中,这些参数被组合在一个WorkerArgs实例中赋给message.obj,通过mWorkerThreadHandler.sendMessage(msg);传递个WorkerHandler类的handlerMessage()方法。
WorkerHandler通过参数token标识与四个全局整数常量标识对比,判断执行增删改查中的哪一个,并通过 final ContentResolver resolver = mResolver.get();
获取ContentResolver实例执行数据库操作,并将返回结果装入WorkerArgs实例中通过 reply.sendToTarget(); 方法传递给AsyncQueryHandler的handlerMessage()方法。下面是Message.sendToTarget()源码:
public void sendToTarget() {
target.sendMessage(this);
}
相当于handler.sendMessage(msg);
最后,AsyncQueryHandler收到消息,分别执行对应的XXXcomplete()方法,这样就实现了,数据库操作完成返回结果时,自动对结果进行进一步操作的功能。
三、使用方法
继承AsyncQueryHandler类,重写需要的方法,主要是各个complete()方法(这些方法在源码中没有实现任何操作)。通过调用其中的startXXX()方法即可完成所需操作。