Android消息机制中,Looper处于核心地位,它类似于一个消息泵,不断从MessageQueue中读取数据,然后分发给Handler去处理。
一、官方建议的使用形式:
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
二、Looper源码阅读:
上述子线程中调用了Looper.prepare()和Looper.loop()到底做了什么事情?
1、先看prepare()方法:
public static void prepare() {
if (sThreadLocal.get() != null) {
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper());
}
prepare是一个静态方法,那就意味着可以直接通过类名访问,这个方法只做了一件事,就是创建一个Looper对象,把这个对象放到sThreadLocal中。在创建之前会判断sThreadLocal是否为空,即保证当前只有一个Looper对象。
那创建Looper对象时做了什么事情呢?
private Looper() {
mQueue = new MessageQueue();
mRun = true;
mThread = Thread.currentThread();
}
创建一个消息队列;
设置run运行变量;
跟当前线程绑定;
2、loop方法:
public static void loop() {
while (true) {
Message msg = queue.next(); // might block
if (msg != null) {
if (msg.target == null) {
// No target is a magic identifier for the quit message.
return;
}
msg.target.dispatchMessage(msg);
msg.recycle();
}
}
上述方法只截取了部分,可见也是一个静态方法,做的事情也很简单,很单调:
不停的检查MessageQueue,拿到Message,根据Message的target将消息分发给Handler,分发完成之后回收消息;
msg.target是handler,这句话是在looper中执行的,然后进入dispatchMessage(msg),也就是说,handler的dispatchMessage(msg)这个方法是在looper的线程中执行的,二dispatchMessage就会执行handler 的handlerMessage方法了,这个显然是在looper的线程中执行的了。
总之,handler的线程就是提供下handler这个实例变量而已,而真正循环处理消息的线程是looper所在的线程了。
3、setMainLooper和getMainLooper方法可以存取主线程的Looper对象。
总结:
Thread和Looper是一一对应关系。
Thread和MessageQueue也是是一一对应关系。
俗一点说:一个Thread只有一个Looper对象,一个MessageQueue对象;
Looper分发消息是阻塞式的(might block),即一个消息分发完成之后才会处理下一个消息;
“Looper就是一个While循环,不停的从MessageQueue读取Message并分发给Handler处理,而调用Looper.loop()启动了循环”
后续文章:
Android知识梳理:消息机制之MessageQueue
Android知识梳理:消息机制之Handler
Android知识梳理:消息机制之Message
分享到:
相关推荐
2. Android消息机制:包括Handler、Looper、MessageQueue和Message的概念及其在Android中的消息处理机制。 3. Android事件分发机制:解析了触摸事件在Android系统中的传递流程和处理。 4. AsyncTask详解:提供了在...
Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系 Android消息循环分析 Android Activity developer 官网 (强烈推荐 dev guide) Android的启动模式(android:launchMode) ...
Looper 是 Android 中的一种消息循环机制,它可以在一个线程中处理消息。Looper 的使用非常广泛,在 Android 开发中,它是必备的知识点之一。 1. Looper 的作用 Looper 的主要作用是将消息从一个线程传递到另一个...
在Android开发领域,掌握一些关键的小知识能够极大地提升开发效率和代码质量。以下是一些根据多年经验整合的Android基础知识: 1. **Activity生命周期**:理解Activity的onCreate(), onStart(), onResume(), ...
### Android高级开发面试题——Handler相关知识 #### 一、HandlerLooperMessage关系 **1. Handler、Looper与Message之间的关系** - **Handler**: 主要用于发送消息和处理消息。它作为一个桥梁,使得主线程和子...
这份“Android最新版最全面试题+知识点整理”提供了超过300道题目,旨在帮助开发者深入理解和巩固Android平台的关键概念。以下是对这些知识点的详细阐述: 1. **Android架构**:了解Android系统的分层结构,包括...
以下是一些主要的Android面试题及相关的知识点,这些内容由大神精心整理,对准备Android面试的开发者非常有帮助。 1. **Android基础知识** - 应用程序组件:Activity、Service、BroadcastReceiver、...
《Android面试题(精心收集整理)》是一份针对Android开发者准备面试的重要参考资料,这份高清PDF文档包含了Android开发领域的各类常见面试问题和解答,旨在帮助求职者深入理解和掌握Android技术体系,提升面试成功率...
以下是对"Android的小知识整理"的详细解读。 1. **Activity生命周期**:理解Activity的onCreate(), onStart(), onResume(), onPause(), onStop()和onDestroy()等生命周期方法至关重要。它们决定了应用在不同状态下...
1. **Android基础知识**:包括Android应用的基本架构(Activity, Service, BroadcastReceiver, ContentProvider),Android组件间的通信机制,以及AndroidManifest.xml文件的作用。 2. **UI设计与布局**:涉及...
这份资源包含了一份PDF文档,详细梳理了Android开发中的关键知识点,以下是对其中主要内容的详细阐述: 一、Android基础 1. 安卓系统架构:理解Linux内核、HAL、Android运行时、应用程序框架和应用层的关系。 2. ...
- Handler/Looper/Messenger:消息机制,解决线程间通信问题。 - Binder:Android进程间通信(IPC)的核心机制,服务和服务的交互。 8. **高级面试题.docx**: - 可能包含更深层次的问题,如Android系统定制、热...
- **多线程和并发**:掌握Handler、Looper、Thread和ExecutorService等多线程处理机制。 3. **Android性能优化** - **内存管理**:了解如何避免内存泄漏,使用Memory Profiler分析应用内存状况。 - **UI流畅性**...
主线程(UI线程)中不需要显式调用Looper.prepare(),因为在Android的UI线程启动时,系统已经自动为其创建了Looper和消息队列。这就是为什么主线程可以直接创建Handler实例而不会崩溃的原因。 知识点三:深入...
这份"Android 书籍整理"的压缩包文件显然是一个宝贵的学习资源,它包含了多种关于Android开发的书籍,旨在为正在学习或想要深入Android技术的开发者提供指导。下面我们将详细探讨这些书籍可能涵盖的知识点。 首先,...
这份"Android最新面试题整理,有道云笔记格式"的资料很可能包含了当前Android开发者在面试过程中可能会遇到的关键问题。以下是一些可能涵盖的知识点,以及它们的重要性: 1. **基础知识**:面试通常会从基础开始,...
1. Handler、Looper与Message:理解消息队列机制,用于解决主线程阻塞问题。 2. AsyncTask:简单的异步任务执行框架,但存在性能瓶颈,不建议在大型项目中使用。 3. IntentService:用于在后台执行一次性任务,会...
对于Android应用开发工程师而言,本书中关于Binder,以及sp、wp、Handler和Looper等常用类的分析或许能帮助你迅速适应Android平台上的开发工作。 (2)Android系统开发工程师 Android系统开发工程师常常需要...
- **Handler-Looper-Messenger**:理解消息队列机制,处理主线程与子线程的交互。 - **AsyncTask**:轻量级的异步任务执行框架,适用于短时间的任务。 - **Thread和Runnable**:基础的线程操作,如何避免内存泄漏...
消息循环机制指的是Android通过Handler、Looper和Message来实现消息的排队和分发。主线程默认已经创建了Looper,工作线程需要手动创建和启动Looper。 4. Android中的服务和IntentService: 服务(Service)用于在...