AsyncQueryHandler
它实际上就是利用多线程的异步处理功能实现的。
public abstract class AsyncQueryHandler extends Handler {
//这个class用来实现两个Handler之间的数据共享
protected static final class WorkerArgs {
public Uri uri;
//这个handler必须有,否则便无法实现线程之间的数据通信
public Handler handler;
public String[] projection;
public String selection;
public String[] selectionArgs;
public String orderBy;
public Object result;
public Object cookie;
public ContentValues values;
}
//这个class是工作类,用来分担主Handler的处理工作
protected class WorkerHandler extends Handler {
public void handleMessage(Message msg) {
args.result = cursor;
}
/*处理之后的结果放在reply.obj交给主handler使用*/
Message reply = args.handler.obtainMessage(token);
reply.obj = args;
reply.arg1 = msg.arg1;
reply.sendToTarget();
}
//这个是AsyncQueryHandler的构造函数,在里面可以看到初始化工作handler,可以借鉴
public AsyncQueryHandler(ContentResolver cr) {
synchronized (AsyncQueryHandler.class) {
if (sLooper == null) {
HandlerThread thread = new HandlerThread("AsyncQueryWorker");
thread.start();
sLooper = thread.getLooper();
}
}
mWorkerThreadHandler = createHandler(sLooper);
}
//这个就用来处理主Handler的消息
public void handleMessage(Message msg) {
/*只不过,在这里,在处理之后,会callback子类的重载函数:onQueryComplete、
onInsertComplete 、onUpdateComplete等*/
}
//那么从何处开始呢?
public void startQuery(int token, Object cookie, Uri uri,
String[] projection, String selection, String[] selectionArgs,
String orderBy) {
//这里发送Message
Message msg = mWorkerThreadHandler.obtainMessage(token);
msg.arg1 = EVENT_ARG_QUERY;
WorkerArgs args = new WorkerArgs();
args.handler = this;//这里,可以看到将主线程的指针交给workHandler,以便回调
args.uri = uri;
args.projection = projection;
args.selection = selection;
args.selectionArgs = selectionArgs;
args.orderBy = orderBy;
args.cookie = cookie;
msg.obj = args;
mWorkerThreadHandler.sendMessage(msg);
}
}