线程(AsyncQueryhandler)
来源:互联网 发布:阿里云免费邮箱入口 编辑:程序博客网 时间:2024/05/18 03:13
AsyncQueryhandler是一个异步并在新线程中操作数据库的一个封装类,一般与ComtentProvider配合使用。
首先,我们先分析下AsyncQueryhandler的工作原理:
AsyncQueryhandler它是一个基础Handler的虚类。
它的主要参数有:
WorkerArgs类:保存当前Hander对象和查询内容
WorkerHandler继承Handler:handlerMessage实现查询过程
startQuery、startInsert、startDelete、startUpdate查询函数
onQueryComplete、onInsertComplete等与查询函数对应的函数
handlerMessage方法
实现原理:
AsyncQueryhandler中有两个handlerMessage,一个是基于外部线程looper的,一个是基于内部WorkerHandler实现的HandlerThread
新线程的looper。外部调用startQuery会通过mWorkerThreadHandler.sendMessage(msg)将查询发送给WorkerHandler中处理,即在
新线程中查询,当WorkerHandler处理完后,把结果发送给AsyncQueryhandler的handlerMessage来调用对应的onXXXComplete函数。
这里就是把查询结果返回给原来线程来处理,这就通过两个handlerMessage实现了两个线程的消息交互。
具体代码实现过程描述:
①
public void startQuery(int token, Object cookie, Uri uri,
String[] projection, String selection, String[] selectionArgs,
String orderBy) {
// Use the token as what so cancelOperations works properly
Message msg = mWorkerThreadHandler.obtainMessage(token);
msg.arg1 = EVENT_ARG_QUERY;
//这里注意args.handler = this;这个是保存AsyncQueryhandler中的handler,提供给WorkerHandler处理完消息后通知AsyncQueryhandler中
//的handlerMessage
WorkerArgs args = new WorkerArgs();
args.handler = this;
args.uri = uri;
args.projection = projection;
args.selection = selection;
args.selectionArgs = selectionArgs;
args.orderBy = orderBy;
args.cookie = cookie;
msg.obj = args;
mWorkerThreadHandler.sendMessage(msg);
}
②
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;
//这里就有刚才保存的那个handler
WorkerArgs args = (WorkerArgs) msg.obj;
int token = msg.what;
int event = msg.arg1;
switch (event) {
case EVENT_ARG_INSERT:
args.result = resolver.insert(args.uri, args.values);
break;
}
// 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();
}
③
public void handleMessage(Message msg) {
WorkerArgs args = (WorkerArgs) msg.obj;
int token = msg.what;
int event = msg.arg1;
// pass token back to caller on each callback.
switch (event) {
case EVENT_ARG_QUERY:
onQueryComplete(token, args.cookie, (Cursor) args.result);
break;
}
}
我们知道原理后就要去熟悉怎么使用了:
private static class QueryHandler extends AsyncQueryHandler {
//实现构造函数等其他操作
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
//实现对应操作完数据库后的函数
}
}
mQueryHandler = new QueryHandler(this);
mQueryHandler.cancelOperation(QUERY_TOKEN);
mQueryHandler.startQuery(QUERY_TOKEN, null, uri, projection, null, null,
People.DISPLAY_NAME);
- 线程(AsyncQueryhandler)
- AsyncQueryHandler学习 (转)
- AsyncQueryHandler
- AsyncQueryHandler
- AsyncQueryHandler
- AsyncQueryHandler
- AsyncQueryHandler
- AsyncQueryHandler
- AsyncQueryHandler
- AsyncQueryHandler
- AsyncQueryHandler
- AsyncQueryHandler
- AsyncQueryHandler
- AdapterView与Adapter(五) --AsyncQueryHandler
- Android中获取联系人信息(二) 使用AsyncQueryHandler
- AsyncQueryHandler研究
- AsyncQueryHandler研究
- android AsyncQueryHandler
- vs2010 和 sqlserver 2008 安装全过程
- eclipse for php (DPT) xdebug 配置 调试php
- SAP外部顾问应该有的素质
- 编程求21位的水仙花数,大家给讲讲思路呗,,谢谢了、、
- 搭建Python的Eclipse开发环境之安装PyDev插件
- 线程(AsyncQueryhandler)
- 短网址对SEO的影响与应用
- 理解IOS数据持久化
- 关于外部顾问的几点看法
- ssh常见面试题(struts,hibernate)
- 成为一个好导师的秘密
- 注册dll文件
- 我的dwr用例小样
- 轻松实现Apache,Tomcat集群和负载均衡