今天晚上研究了一下啊AsyncQueryHandler,收获挺大,记录下重要知识点,以后继续补充研究。
研究AsyncQueryHandler这个类的时候遇到了几个重要的不清楚的知识点
1. Handler与Thread,Looper的关系
2. HandlerThread是干什么用的
3. ThreadLocal类是干什么用的
Handler主要是用来发送和处理消息,但是发送了消息后,消息是怎么传递的呢?这就是Looper的作用了,每个Handler中都会有一个Looper对象,如果在创建Handler的时候不指定,系统就会默认将当前线程的Looper绑定到Handler上,Looper对象中维护者一个消息队列,Hander发送的消息都会存储到这个消息队列中,Looper不断的遍历这个消息队列,取出消息,交给handleMessage方法处理。Looper属于哪个线程,hadleMessage方法就会在那个线程中执行。
HandlerThread不但能提供异步处理,Handler处理消息的方法也会在这个线程中执行,他最要的作用就是提供了一个线程。(这个类还有待研究)
ThreadLocal类主要是用来多个模块共享变量用的,但是不同线程之间的变量的值却不相同。
说明1:对象a,对象b比如说是某个类的实例对象,在模块A,B,C中共享对象a,还有对象b,在线程A中,模块A中设置a的值,在模块B,C中取出a的值,三个模块操作的是同一个值,但是对象a和对象b分别属于两个线程,他们是不同的。
AsyncQueryHandler的工作机制是什么?
AsyncQueryHandler继承了Handler对象,但是他提供的构造方法中却没有Looper参数,也就是说他和他所在的当前线程绑定,AsyncQueryHandler内部有一个Hhandler对象,叫mWorkerHandler,他和一个HandlerThread绑定,mWorkerHandler负责将打包好的消息发送,并且处理,并将结果作为消息发送给AsyncQueryHandler。他是怎么发送的?AsyncQueryHandler内部有一个WorkerArgs完美类,他封装了startAsyncQuery等方法的参数,并且通过这行代码
WorkerArgs args = new WorkerArgs();
args.handler = this;
将当前Handler封装进去,发送到HandlerThread中去,mWorkerHandler处理完消息得到结果后,args.handler将结构发送给自己进行处理。(这就是线程间的通信了)
mWorkerHandler和一个子线程绑定,能够处理比较耗时的操作,AsyncQueryHandler提供异步处理。
总结:
Handler有两个作用,Handler用在一个线程中,就是实现异步操作。用在不同的线程之间,那就是异步操作加线程间通信。
补充:
HandlerThread:
先看他的类描述:Handy class for starting a new thread that has a looper. The looper can then beused to create handler classes. Note that start() must still be called.
这是一个包含了Looper对象的线程,这个looper可以用来创建Handler对象,记住:start()方法必须被调用,否则通过getLooper方法得到的looper对象是空的。通过调用start方法,就会去执行该线程的run方法,public void run() {
mTid = Process.myTid();
Looper.prepare();//创建一个Looper实例,并且存储在ThreadLocal中,ThreadLocal中维护一个HashMap,键是线程号
synchronized (this) {
mLooper = Looper.myLooper();//得到当前线程的Looper,就是刚才perpare方法中创建并存储的那个Looper实例
Process.setThreadPriority(mPriority);
notifyAll();
}
onLooperPrepared();
Looper.loop();//开始轮询
mTid = -1;
}
public static final void prepare() {
if (sThreadLocal.get() != null) {
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper());
}
public static final Looper myLooper() {
return (Looper)sThreadLocal.get();
}
AsyncQueryHandler是如何提供onxxxComplete方法给用户,由用户自己实现的?
public abstract class AsyncQueryHandler extends Handler 他是一个抽象类
MessageQueue是不是一个任务队列?
是,他是一个优先级队列(可以通过ArrayList的排序来实现)。它内部自己维护一个ArrayLsit集合,用来存储Message消息,Message消息有三种,普通消息,按照先发送先执行的FIFO原则进行;高优先级的消息,这种消息会直接插在队列的最前面,立刻执行;还有一种定时消息,类似于定时任务,到时间才执行。
Looper是如何轮询MessageQueue的?
当在主线程中使用Handler的时候,不用指定Looper,因为在主线程开启的时候,就已经调用了Looper.loop()方法开始轮询了。
挡在子线程中使用Handler的时候,通过调用Looper的prepare方法创建存储Looper对象,还得调用Looper.loop()方法开启轮询。
当配合HandlerThread使用Handler的时候,HandlerThread的run方法中调用了Looper.loop()方法。
public static final void loop() {
Looper me = myLooper();
MessageQueue queue = me.mQueue;
while (true) {
Message msg = queue.next(); // might block
//if (!me.mRun) {
// break;
//}
if (msg != null) {
if (msg.target == null) {
// No target is a magic identifier for the quit message.
return;
}
msg.target.dispatchMessage(msg);
msg.recycle();
}
}
}
Message消息实现了Parcelable接口
分享到:
相关推荐
private AsyncQueryHandler asyncQueryHandler = new AsyncQueryHandler(getContentResolver(), getMainLooper()); ``` **2. 启动异步查询** AsyncQueryHandler提供了一个startQuery()方法用于启动异步查询。这个...
`AsyncQueryHandler`是Android系统提供的一种用于在后台线程执行SQLite数据库查询的工具类,它可以避免因为长时间数据库操作导致的ANR(Application Not Responding)错误。下面我们将深入探讨`AsyncQueryHandler`的...
`AsyncQueryHandler` 是Android系统提供的一种异步处理数据库查询的方法,特别适用于从SQLite数据库中读取大量数据,如手机联系人列表。本篇文章将深入探讨如何使用`AsyncQueryHandler`来实现手机联系人信息的异步...
而`AsyncQueryHandler`是Android系统提供的一个辅助类,用于在ContentProvider中执行异步查询操作,避免阻塞主线程,提升用户体验。这篇博客()可能会详细解析这个帮助类的工作原理和使用方法。 `...
本代码是QuickContactBadge和AsyncQueryHandler实现联系人列表的完美实现,对初级程序员会有很大的帮助,可以直接拿来用,还带了首字母拼音的滑动栏,里面有自定义控件可以让你好好学习
在Android开发中,`AsyncQueryHandler` 和 `ContentProvider` 是两个非常重要的组件,它们用于高效、异步地处理数据库查询,并将结果显示到UI上,如ListView等。本篇文章将详细解析这两个组件以及相关的Adapter用法...
为了提高用户体验并避免阻塞主线程,我们可以使用`AsyncQueryHandler`来异步处理查询操作。本文将详细介绍如何使用`AsyncQueryHandler`实现获取手机联系人的功能。 首先,我们来看一下布局文件`main.xml`。这是一个...
作者提出利用AsyncQueryHandler异步查询辅助类来获取短信会话列表,避免因长时间阻塞主线程导致的ANR(Application Not Responding)异常。这种异步处理方式可以提高系统的响应速度和用户体验。 在短信显示方面,...
在本文中,我们将深入探讨`AlphabetListView`的工作原理、如何使用以及其与`AsyncQueryHandler`的结合。 ### 1. `AlphabetListView`概述 `AlphabetListView`的核心功能是提供一个侧边栏,显示A到Z的字母,用户可以...
这个功能涉及到多个关键组件和技术,包括`ActionBar`、`Fragment`以及`AsyncQueryHandler`。接下来,我们将详细讨论这些知识点。 首先,`ActionBar`是Android UI设计模式中的一种,它位于应用顶部,提供应用程序的...
本案例主要探讨了如何使用Android的SQLite数据库,以及与之相关的组件和工具,如ContentProvider、AsyncQueryHandler和SQLiteOpenHelper。以下是这些关键知识点的详细说明。 1. **SQLite数据库**: 安卓系统默认支持...
在Android开发中,消息机制和异步多线程是至关重要的概念,...通过理解和熟练运用`Handler`、`Looper`、`Message`以及像`AsyncQueryHandler`这样的工具,开发者能够高效地处理异步任务,同时确保应用的稳定性和响应性。
- **查询消息发送**:在 `startQuery()` 方法中,通过调用 `AsyncQueryHandler` 的 `startQuery()` 方法,应用程序发送查询请求。这个方法接收查询标识、回调上下文、查询的URI、投影字段、选择条件、选择参数以及...
此外,DataDroid还支持异步查询,通过AsyncQueryHandler可以在后台线程执行查询,避免阻塞UI,提高用户体验。 再者,DataDroid在事务管理方面也做得相当出色。使用TransactionManager,开发者可以方便地进行数据库...
《深入解析Android QuickSearchBox程序源码》 在Android系统中,QuickSearchBox(QSB)是一个非常重要的组件,...通过深入研究源码,开发者不仅能了解Android系统的内部运作,还能为自己的应用提供更优秀的搜索体验。
例如,`AsyncQueryHandler`是Android提供的一种处理与`ContentProvider`交互的异步方式,它是`Handler`的子类,简化了对数据库查询的处理。通过继承`AsyncQueryHandler`并重写相关方法,开发者可以轻松实现数据库...
- `mQueryHandler`是`QueryHandler`的实例,它继承自`AsyncQueryHandler`,负责异步查询联系人数据。 - 在`onResume`方法中,会检查是否需要执行查询。如果是在默认模式下,并且是第一次打开应用,会调用`...
识别U盘主要依赖于`ContentResolver`和`AsyncQueryHandler`这两个组件。 - `ContentResolver` 是Android系统中用于与ContentProvider进行通信的接口,它可以查询、插入、更新和删除数据。 - `AsyncQueryHandler` ...
这个例子,主要是在db数据库中新建一个表,并提供正常的增,删,改,查操作和使用AsyncQueryHandler来异步对db数据库的数据进行增,删,改,查操作,以减少操作的时间,提高效率.csdn详细说明网址:...