android AsyncQueryHandler的分析

本文深入解析AsyncQueryHandler类,它通过利用多线程的异步处理功能,实现数据共享与主线程之间的高效交互。重点介绍了类内部结构,包括WorkerArgs与WorkerHandler的作用,以及如何在主线程与工作线程间传递消息和数据,最终实现复杂任务的并发处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值