Android AsyncQueryHandler

AsyncQueryHandler是Android中用于异步处理ContentProvider查询的类,能避免UI线程因大数据处理导致的ANR异常。它通过HandlerThread和WorkerHandler实现异步操作。在startQuery方法中,消息被发送到WorkerHandler执行查询,查询结果再回调到AsyncQueryHandler的handleMessage方法,保证了查询操作的后台执行。本文还介绍了AsyncQueryHandler的简单使用示例。
摘要由CSDN通过智能技术生成

最近在做项目的时候,查看前辈写的代码,发现了AsyncQueryHandler.startQuery()这种写法。

由于以前一直没有使用过AsyncQueryHandler这个类,所以就根据网上查找到的信息和自己查看源码的的理解写下这篇文章。

本文的理解比较浅显,如果有理解错误,欢迎指正。

首先感谢如下两篇文章的作者,感谢他们的无私分享。

https://blog.csdn.net/weixin_42193691/article/details/82469627

https://blog.csdn.net/t12x3456/article/details/7912805

AsyncQueryHandler的简介

根据源码中的说明,可以很明显的发现AsyncQueryHandler是一个异步处理ContentProvider的抽象帮助类,该类可以实现ContentProvider的增删改查,但是根据类名和说明的话只能体现这个功能,但是我为什么这样说呢,请看下面的WorkerHandler这个章节。

/**
 * A helper class to help make handling asynchronous {@link ContentResolver}
 * queries easier.
 */
public abstract class AsyncQueryHandler extends Handler {
  

我们一般在处理ContentProvider是直接通过ContentResolver直接处理的。在小数据的时候,这种方式是没有什么问题的。

但是当我们需要处理的数据是很大的时候,如果直接通过ContentResolver在UI线程中直接处理的话,很有可能会发生ANR异常(超过5秒)。

当然你也可以写个Handler去做这些操作,但是Android已经封装好异步查询框架AsyncQueryHandler,所以为什么不使用AsyncQueryHandler来让我们事半功倍呢。

AsyncQueryHandler实现原理

HandlerThread

查看AsyncQueryHandler的构造函数,发现首先构建一个HandlerThread,并且获取这个HandlerThread的Looper,然后通过Looper创建Handler。

所以AsyncQueryHandler构建一个可以用于异步操作的handler,并将前面创建的HandlerThread的Looper对象作为参数传递给当前的handler,这样当前的异步handler就拥有了HandlerThread的Looper对象,由于HandlerThread本身是异步线程,因此Looper也与异步线程绑定,从而handlerMessage方法也就可以异步处理耗时任务了,这样我们的Looper+Handler+MessageQueue+Thread异步循环机制构建完成。如果对于HandlerThread有什么不懂的,可以看看https://blog.csdn.net/javazejian/article/details/52426353这篇文章。

    public AsyncQueryHandler(ContentResolver cr) {
        super();
        mResolver = new WeakReference<ContentResolver>(cr);
        synchronized (AsyncQueryHandler.class) {
            if (sLooper == null) {
                HandlerThread thread = new HandlerThread("AsyncQueryWorker");
                thread.start();

                sLooper = thread.getLoop
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值