android AsyncQueryHandler的分析
AsyncQueryHandler
它实际上就是利用多线程的异步处理功能实现的。
publicabstractclassAsyncQueryHandlerextendsHandler{
//这个class用来实现两个Handler之间的数据共享
protectedstaticfinalclassWorkerArgs{
publicUriuri;
//这个handler必须有,否则便无法实现线程之间的数据通信
publicHandlerhandler;
publicString[]projection;
publicStringselection;
publicString[]selectionArgs;
publicStringorderBy;
publicObjectresult;
publicObjectcookie;
publicContentValuesvalues;
}
//这个class是工作类,用来分担主Handler的处理工作
protectedclassWorkerHandlerextendsHandler{
publicvoidhandleMessage(Messagemsg){
args.result=cursor;
}
/*处理之后的结果放在reply.obj交给主handler使用*/
Messagereply=args.handler.obtainMessage(token);
reply.obj=args;
reply.arg1=msg.arg1;
reply.sendToTarget();
}
//这个是AsyncQueryHandler的构造函数,在里面可以看到初始化工作handler,可以借鉴
publicAsyncQueryHandler(ContentResolvercr){
synchronized(AsyncQueryHandler.class){
if(sLooper==null){
HandlerThreadthread=newHandlerThread("AsyncQueryWorker");
thread.start();
sLooper=thread.getLooper();
}
}
mWorkerThreadHandler=createHandler(sLooper);
}
//这个就用来处理主Handler的消息
publicvoidhandleMessage(Messagemsg){
/*只不过,在这里,在处理之后,会callback子类的重载函数:onQueryComplete、
onInsertComplete、onUpdateComplete等*/
}
//那么从何处开始呢?
publicvoidstartQuery(inttoken,Objectcookie,Uriuri,
String[]projection,Stringselection,String[]selectionArgs,
StringorderBy){
//这里发送Message
Messagemsg=mWorkerThreadHandler.obtainMessage(token);
msg.arg1=EVENT_ARG_QUERY;
WorkerArgsargs=newWorkerArgs();
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);
}
}
更多相关文章
- 我的Android工作笔记
- Android(安卓)4.0 wifi 和 Ethernet 的实现分析
- android 访问WebService
- 安卓WebView与JavaScript交互
- 在Android中访问WebService接口
- android细节:各种context
- 使用Maven管理Android项目(二)
- resolveActivity解析
- 基于Android的Linux内核的电源管理:Early Suspend