AsyncQueryHandler异步操作数据库的使用和源码解析

Android AsyncQueryHandler 最近在做项目的时候,查看前辈写的代码,发现了AsyncQueryHandler.startQuery()这种写法。 由于以前一直没有使用过AsyncQueryHandler这个类,所以就根据网上查找到的信息和自己查看源码的的理解写下这篇文章。 本文的理解比较浅显,如果有理解错误,欢迎指正。 首先感谢如下两篇文章的作者,感谢他们的无私分享。 https://blog.youkuaiyun.com/weixin_42193691/article/details/82469627 https://blog.csdn 阅读详情

一.AsyncQueryHandler的作用:

异步的查询操作帮助类,它可以处理增删改查。当然也可以使用ContentProvider去操作数据库。这在数据量很小的时候是没有问题的,但是如果数据量大了,可能导致UI线程发生ANR事件。当然也可以写个Handler去做这些操作,只是每次使用ContentProvider时都要再写个Handler,必然降低了效率。因此API提供了一个操作数据库的通用方法。它提供:startInsert,startDelete,startUpdate,startQuery这四个操作,并提供相对应的onInsertComplete,onDeleteComplete,onUpdateComplete,onQuerytComplete四个方法,以供操作完数据库后进行其它的操作,这四个 onXXXComplete方法都是空实现,以便我们只需要去实现我们关注的操作。
 

二.AsyncQueryHandler的使用方法:

1.需要继承AsyncQueryHandler类,并提供onInsertComplete方法的实现(可以实现任何一个或多个,当然也可以一个也不实现,如果你不关注操作数据库的結果),在的实现中做一些对数据库操作完成的处理。
2.使用时直接调用startQuery(或者其他四个中的任何一个)方法即可。传入的通用参数如下:
token,一个令牌,需要跟onQueryComplete方法传入的一致。(当然也可以不一致,同样在数据库的操作结束后会调用对应的onQueryComplete方法 )。
cookie,你想传给onQueryComplete方法使用的一个对象。(没有的话传递null即可)。
Uri uri(进行查询的通用资源标志符)。
projection 查询的列
selection  限制条件
orderBy 排序条件

三.使用场景:

异步操作数据库,在主线程回调更新ui.
要注意的是,一般在查询本地的应用的数据的时候要去采用CursorAdapter。


四、AsyncQueryHandler内部实现

AsyncQueryHandler类封装了调用者线程与工作线程的交互过程。交互的主体是两个Handler,一个运行在调用者线程中,一个运行在工作者线程中。通过提供onXXXComplete的回调接口,实现事件的完成处理。
API中提供
startInsert,
startDelete,
startUpdate,
startQuery四种方法,并有响应的onXXXComplete()方法.于对应的4个onXXXComplete()方法都是空实现,因此我们完成相应调用后进行后续其他的操作. 

mWorkerThreadHandler是在工作线程中的handler,

AsyncQueryHandler 本身也是个handler,是在主线程中

public abstract class AsyncQueryHandler extends Handler 

if (sLooper == null) {
        HandlerThread thread = new HandlerThread("AsyncQueryWorker");
        thread.start();
        sLooper = thread.getLooper();
   }
}
mWorkerThreadHandler = createHandler(sLooper);

发起操作之后,从主线程通过handler抛到工作线程,工作线程在非主线程完成相关数据库操作,将结果抛回主线程


五、简单代码示例

 private void startQuery() {


        Uri uri = Sms.CONVESATION_URI;


        mQueryHandler.startQuery(0, null, uri, CONVERSATION_PROJECTION, null, null, "sms.date desc");


    }


    // 写一个异步查询类  


private final class QueryHandler extends AsyncQueryHandler {


        public QueryHandler(ContentResolver cr) {


            super(cr);


        }
        
        @Override
        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {


            super.onQueryComplete(token, cookie, cursor);


            // 更新mAdapter的Cursor  


            mAdapter.changeCursor(cursor);


        }


}
 




欢迎扫描二维码,关注公众号



Android 小积累之AsyncQueryHandler用法 NULL 博文链接:https://chenleijava.iteye.com/blog/1850157 立即下载

相关推荐

Gamma变换算法之Matlab&FPGA实现

Gamma映射原理 什么是Gamma曲线 人眼的感光与光强并不是呈线性关系的,而是呈非线性关系(指数型关系,如下图左-曲线。在低照度下,人眼更容易分辨出亮度的变化,随着照度的增加,人眼不易分辨出亮度的变化。而图像传感器与输入光强呈线性关系(如下图左-直线)。从图中可见,当传感器感光在20%左右时,人眼感光响应达到了50%,人眼对低照度的变化更为敏感。从下图右侧可见,Reference Tone为人眼感光50%的亮度,而传感器在感光50%时则相对暗的多(见Select,近似中性灰)。这种将原始图像通过映射操

CrazyBingo的博客 7405

通过AsyncQueryHandler异步对数据库进行增删查操作

AsyncQueryHandler的作用异步对数据库进行增加、删除、更新、查询操作。避免在主线程中直接调用数据库相关操作导致的ANR异常。AsyncQueryHandler使用步骤 自定义继承AsyncQueryHandler的子类,实现相关的方法。 void onDeleteComplete(int token, Object cookie, int result)

a day a better 1104

Linux Component概述和高通component的使用

为了让subsystem按照一定顺序初始化设备才提出来的。subsystem中由很多设备模块,内核加载这些模块的时间不确定。子系统内有些模块是需要依赖其它模块先初始化才能进行自己初始化工作(例如v4l2 subdev和v4l2 video device),这时就要用到component框架。例如v4l2 subdev和v4l2 video device中,谁依赖谁先创建?

lz_1990的专栏 1609

AsyncQueryHandler详解及使用

AsyncQueryHandler详解及使用 AsyncQueryHandler详解及使用 AsyncQueryHandler概述 AsyncQueryHandler实现原理 AsyncQueryHandler的使用 AsyncQueryHandler概述 项目中,用到了AsyncQueryHandler,所以在这里将自己对它的理解写出来,做一个总结。如果有错误的地方,或...

大狮子的博客 4846

施耐德 Modicon M580 ePAC 项目实战:从硬件选型到 Control Expert V15 组态

本文详细解析了施耐德 Modicon M580 ePAC 在工业自动化项目中的实战应用,从硬件选型到 Control Expert V15 组态的全流程。重点介绍了水处理站控制系统的硬件配置、网络架构设计、软件安装授权及程序框架开发,帮助工程师高效实施中大型控制系统项目。

weixin_33701617的博客 326

CH455G数码管驱动与键盘扫描:I2C通信协议深度解析与实战代码

本文深度解析CH455G芯片的I2C通信协议,涵盖数码管驱动与键盘扫描功能的实战应用。通过详细讲解起始/停止信号、数据帧结构、应答机制及单片机代码实现,帮助开发者高效利用该芯片减少IO占用,提升嵌入式系统设计效率。

tea88的博客 1084

android之AsyncQueryHandler详解

官方文档对AsyncQueryHandler的解释非常简洁 A helper class to help make handling asynchronousContentResolver queries easier 下面解释一番,其实明白之后就会发现,真的就是一句话的事情而已. AsyncQueryHandler:异步的查询操作帮助类,其实它同样可以处理增删改, 查询其API便可知,它...

移动编程 252

STM32开发者必看:如何在正点原子探索者开发板上快速移植CANopenNode协议栈

本文为STM32开发者提供了在正点原子探索者开发板上快速移植CANopenNode协议栈的实战指南。文章详细介绍了从环境准备、硬件抽象层适配到协议栈初始化与测试的全过程,并分享了PDO配置与性能优化等关键技巧,帮助开发者高效实现CANopen标准化通信。

weixin_29173777的博客 462

基于Android源码中的AsyncQueryHandler的技术解析

是Android提供的一个辅助类,位于包中。它继承自Handler,主要用于在后台线程中执行数据库查询操作,并通过消息机制将结果返回到主线程中。特别适用于处理的查询操作,因为它内部封装了的使用。是Android中一个非常实用的工具类,特别适合用于处理的异步查询操作。它简化了异步数据库操作的实现,避免了手动管理线程和Handler的复杂性。通过本文的介绍,相信你已经对有了更深入的理解,并能够在实际项目中灵活运用它。

zhangjiaofa的专栏 1049

51单片机学习(5)-----蜂鸣器的介绍与使用

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计 算机、 打印机、 复印机、 报警器、 电子玩具、 汽车电子设备、 电话机、 定 时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。1.半导体三极管也称为晶体三极管,可以说它是电子电路中最重要的器件。三极管顾名思义具有三个电极。二极管是由一个PN结构成的,而三极管由两个PN结构成,共用的一个电极成为三极管的基极(用字母b表示)。其他的两个电极成为集电极(用字母c表示)和发射极(用字母e表示)。

2302_80260350的博客 1万+

仅使用 Python 创建的 Web 应用程序(前端版本)第03章Streamlit-多页面

接下来,我们将解释多页面切换。Streamlit 没有“多页面”或“页面路由”等功能。另一方面,通过根据用户动作切换要执行的功能,可以使其看起来好像存在“多个页面”。注意:我认为它类似于 SinglePageApplication (SPA)。然而,根据 React、Vue 等中使用的 URL 路径来更改页面的路由很困难。还有一个用于获取查询参数的实验性 API,但如果您确实需要这种功能,我认为认真尝试编写 React 或 Vue 是个好主意。我们来看一个通过按下按钮来切换页面的示例,如下所示。

xianyinsuifeng的博客 1326

Android-AsyncQueryHandler 详解【整理】

1,AsyncQueryHandler 简介     AsyncQueryHandler的目的就是为了将查询数据库的操作放到后台执行,当后台数据查询完了以后,再通知界面的更新,以此来提高前台页面的显示速度!当然你也可以使用ContentProvider去操作数据库。这在数据量很小的时候是没有问题的,但是如果数据量大了,可能导致UI线程发生ANR事件。当然你也可以写个Handler去做这些操作,只...

fanleiym的专栏 955

大疆司空 2 私有化部署:FH2、Terra、4G 三大服务区别详解

摘要: 司空2私有版包含三大模块:FH2(核心平台,必选)、Terra(建模算力,需NVIDIA显卡)、4G(内网图传)。FH2是基础,支持设备管理与任务调度;Terra适用于测绘建模场景,依赖GPU算力;4G模块保障复杂环境下的图传稳定性,适合纯内网部署。选择逻辑:先部署FH2,再按需添加Terra(需显卡)或4G(需内网支持),避免资源浪费。

2501_93651177的博客 576

Handler官方范例AsyncQueryHandler源码解析

在阅读本文之前,你需要了解Handler作为Android中的线程间通信机制究竟是如何运作的,可以参考Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系源码/** * A helper class to help make handling asynchronous {@link ContentResolver} * queries easier

端泽的专栏 631

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

AsyncQueryHandler学习

学习这个类之前,需要先理解几个知识点: 1. Handler与Thread,Looper的关系 2. HandlerThread的作用 3. ThreadLocal类的作用   Handler 主要是用来发送(sendMessage)和处理消息(handleMessage),但是发送了消息后,消息是怎么传递的呢?这就是Looper(消息泵)的作用了,每个Handler中都会有一个Loop

android 开发专栏 1860

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

contentprovider异步查询帮助类:AsyncQueryHandler

/** * A helper class to help make handling asynchronous {@link ContentResolver} * queries easier. */   从源码中的注释可知,AsyncQueryHandler类是contentprovider异步查询的帮助类,利用它可以很方便地实现异步访问contentprovider,它的使用很简单,看ap...

iteye_6813的博客 468

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android query函数,Android 异步任务知识梳理(3) - AsyncQueryHandler 源码解析

一、概述AsyncQueryHandler方便了我们对ContentProvider进行增、删、改、查,此外,我们通过学习它的原理可以更好地理解HandlerThread,学习如何在项目中使用它。二、源码AsyncQueryHandler中的关键是mWorkerThreadHandler,它在其handleMessage中进行操作,因为它在构造时传入的Looper所关联的Thread并不是主线程,...

weixin_42676678的博客 220

Android 异步查询框架AsyncQueryHandler分析

Android 异步查询框架AsyncQueryHandler分析在一般的应用中可以使用ContentProvider去操作数据库。 这在数据量很小的时候是没有问题的,但是如果数据量大了,可能导致UI线程发生ANR异常(超过5秒)。 当然你也可以写个Handler去做这些操作,只是你每次使用ContentProvider时都要再写个Handler,必然降低了效率。 因此当数据量较大时,最

RongDaiL的专栏 561

AsyncQueryHandler详解

学习这个类之前,需要先理解几个知识点: 1. Handler与Thread,Looper的关系 2. HandlerThread的作用 3. ThreadLocal类的作用   Handler 主要是用来发送(sendMessage)和处理消息(handleMessage),但是发送了消息后,消息是怎么传递的呢?这就是Looper(消息泵)的作用了,每个Handler中都会有一个Loop

chencangui的专栏 567

Android 异步任务知识梳理(3) AsyncQueryHandler 源码解析

一、概述 AsyncQueryHandler方便了我们对ContentProvider进行增、删、改、查,此外,我们通过学习它的原理可以更好地理解HandlerThread,学习如何在项目中使用它。 二、源码 AsyncQueryHandler中的关键是mWorkerThreadHandler,它在其handleMessage中进行操作,因为它在构造时传入的Looper所关联的Thread并不是主...

weixin_34128411的博客 118

AsyncQueryHandler学习 (转)

每天进步一点 转载链接:http://blog.sina.com.cn/s/blog_5da93c8f0100yy7x.html 学习这个类之前,需要先理解几个知识点: 1. Handler与Thread,Looper的关系 2. HandlerThread的作用 3. ThreadLocal类的作用   Handler 主要是用来发送(sendMessage)和处理消息(h

FengYingYouHen的专栏 463

HandlerThread与AsyncQueryHandler源码分析

HandlerThread与AsyncQueryHandler源码分析 1. HandlerThread HandlerThread继承自Thread,其本质还是一个Thread子类,只不过它内部封装了一个Looper,可以进行消息轮询,实现主线程向子线程发送消息,子线程根据消息类型执行相应代码,主要是耗时操作,如访问IO、查询数据库,...

weixin_34090643的博客 118

android_AsyncQueryHandler的理解_2011-10-26

本文没有那么多的废话,直接看代码: 此为AsyncQueryHandler的构造方法 public AsyncQueryHandler(ContentResolver cr) { super(); mResolver = new WeakReference(cr); synchronized (AsyncQueryHandler.class)

kangqiao182的专栏 2736

Miui Note源码解析

我们先从AndroidManifest.xml中的代码看起。<?xml version="1.0" encoding="utf-8"?><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) Licensed under the Apache License, Version 2.0 (t

1801
上一篇: Android中asset文件夹和raw文件夹
下一篇: Android热补丁技术方案整理
robert_chao
博客等级 码龄15年 265粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值