AsyncQueryHandler源码分析

 
 
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()方法即可完成所需操作。
AsyncQueryHandler是一个用于实现异步操作数据库功能的抽象类。它继承自Handler类,并通过两个不同的Handler在主线程和异步线程中进行操作。在构造函数中,AsyncQueryHandler接收一个ContentResolver对象作为参数,并创建一个对ContentResolver的弱引用。同时,它还创建了一个名为"AsyncQueryWorker"的HandlerThread,并获取其Looper。接下来,AsyncQueryHandler通过createHandler方法创建了一个WorkerHandler,该Handler在异步线程中处理消息。\[1\] 在使用AsyncQueryHandler时,可以通过调用startQuery方法来发起查询操作。查询结果将通过WorkerHandler的handleMessage方法传递给AsyncQueryHandler的handleMessage方法。最后,可以在onDeleteComplete方法中处理删除操作的结果。\[2\] 总的来说,AsyncQueryHandler通过在主线程和异步线程中的两个Handler之间的消息传递,实现了异步访问数据库的功能。\[3\] #### 引用[.reference_title] - *1* *3* [AsyncQueryHandler详解及使用](https://blog.csdn.net/weixin_42193691/article/details/82469627)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Android-AsyncQueryHandler 详解【整理】](https://blog.csdn.net/fanleiym/article/details/83783949)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值