Android Looper
(1) Looper类别用来为一个线程开启一个消息循环。默认情况下Android中新诞生的线程是没有开启消息循环的。(主线程除外,主线程系统会自动为其创建Looper对象,开启消息循环)
Looper对象通过MessageQueue来存放消息和事件。一个线程只能有一个Looper,对应一个MessageQueue。
(2) 通常是通过Handler对象来与Looper交互的。Handler可看做是Looper的一个接口,用来向指定的Looper发送消息及定义处理方法。
默认情况下Handler会与其被定义时所在线程的Looper绑定,比如,在主线程中定义,其是与主线程的Looper绑定。
mainHandler = new Handler() 等价于new Handler(Looper.myLooper()).
Looper.myLooper():Return the Looper object associated with the current thread 获取当前进程的looper对象。
还有一个类似的 Looper.getMainLooper() 用于获取主线程的Looper对象。
(3) 在非主线程中直接new Handler() 会报如下的错误:
E/AndroidRuntime( 6173): Uncaught handler: thread Thread-8 exiting due to uncaught exception
E/AndroidRuntime( 6173): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
原因是非主线程中默认没有创建Looper对象,需要先调用Looper.prepare()启用Looper。
(4) Looper.loop(); 让Looper开始工作,从消息队列里取消息,处理消息。
注意:写在Looper.loop()之后的代码不会被执行,这个函数内部应该是一个循环,当调用mHandler.getLooper().quit()后,loop才会中止,其后的代码才能得以运行。
(5) 基于以上知识,可实现主线程给子线程(非主线程)发送消息。
把下面例子中的mHandler声明成类成员,在主线程通过mHandler发送消息即可。
(6) Android官方文档中Looper的介绍:
Class
used to run a message loop for a thread. Threads by default do not have
a message loop associated with them; to create one, call
prepare()
in the thread that is to run the loop, and then
loop()
to have it process messages until the loop is stopped.
Most interaction with a message loop is through the
Handler
class.
This is a typical example of the implementation of a Looper thread, using the separation of
prepare()
and
loop()
to create an initial Handler to communicate with the Looper.
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();
}
}
分享到:
相关推荐
Android Looper 使用介绍 Android Looper 是 Android 操作系统中的一种机制,用于在单线程中创建消息循环,以便实现线程之间的通信和消息处理。Looper 对象通过 MessageQueue 来存放消息和事件,每个线程只能有一...
在Android系统中,`Looper`是一个至关重要的组件,它与`Handler`和`MessageQueue`共同构成了Android的消息处理机制。这个机制使得UI线程能够处理来自其他线程的异步消息,保持用户界面的响应性。这篇博客文章可能...
android looper handler 子线程 主线程详解
### Android Looper 分析 #### 一、概述 在 Android 应用开发中,消息处理机制扮演着极其重要的角色。Looper 类与 Handler 和 Message Queue 共同构成了 Android 的消息处理框架,它们之间的协同工作保证了应用...
在Android开发中,`Looper`、`Handler`和`MessageQueue`是三个关键组件,它们共同构成了Android消息处理系统,用于实现线程间的通信,尤其是让UI线程能够响应非UI线程的数据更新。让我们深入探讨一下这些概念及其在...
Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,使用Looper....
在Android系统中,`Looper`是一个至关重要的组件,它在消息传递和事件处理机制中扮演着核心角色。本文将深入探讨`Looper`的工作原理、如何使用以及它在Android应用程序中的应用。 `Looper`是Android消息循环的核心...
在Android系统中,`Looper`类扮演着至关重要的角色,它是消息循环机制的核心。`Looper`使得线程能够处理来自`Handler`的消息,是Android异步通信和事件驱动模型的基础。下面将详细介绍`Looper`对象及其相关的主要...
自己写的关于Android的Looper的示例程序。在主线程即UI线程外,新建一个Looper线程,并用Messenger和Handler来处理message和posted runnable。程序中,在负线程中默认加了一个3s的线程等来,来帮助理解sent message...
`Looper`、`Handler`以及`Message`是Android异步通信的核心组件。本篇文章将深入探讨如何自定义带有消息循环`Looper`的线程。 首先,我们需要了解`Looper`的作用。`Looper`是Android系统中的一个类,它负责在一个...
Android应用的运行基于消息驱动模型,这一模型的核心在于Looper、Handler和MessageQueue的协同工作。下面我们将深入理解这三个组件的作用及其交互。 1. **Message(消息)**: - Message是应用程序中传递信息的...
它提供了方便的方法,允许开发者直接将Android的主线程和Looper线程作为RxJava的调度器来使用。 RxJava是一个非常流行的响应式编程库,它引入了一种声明式的方式来处理异步数据流。在Android开发中,通常需要在特定...
本文将深入探讨Android中的三种主要线程模式:Handler、Thread以及Looper,并结合源码分析它们的工作原理。 首先,我们来理解一下Android应用的基本运行环境。Android系统默认在主线程(UI线程)中执行所有的用户...
Android 多线程 Looper Handler Android 操作系统中,多线程是一种常见的编程技术,通过使用多线程,可以提高应用程序的响应速度和效率。在 Android 中,多线程可以分为两种:有消息循环的线程和没有消息循环的线程...
### Android之Looper、MessageQueue、Handler与消息循环详解 #### 一、概述 在Android开发过程中,消息处理机制是至关重要的部分,它涉及到应用程序如何管理、传递和响应各种事件。本篇文章将深入探讨Android中...
首先,`Looper`是Android消息循环的核心。它的主要任务是不断地从`MessageQueue`中取出`Message`对象,并将其分发给相应的`Handler`进行处理。`Looper`的构造函数是私有的,目的是为了防止直接实例化,而是通过`...
在Android应用开发中,Handler、Looper和Message是实现线程间通信的重要机制,尤其是在主线程与工作线程之间同步数据和执行UI更新时。Handler、Looper和Message三者结合使用,构建了一个消息处理系统,使得非UI线程...
在Android系统中,Looper是消息循环机制的核心组件,它与Handler和Message紧密配合,使得应用程序能够实现线程间的通信。本文将深入探讨Looper的工作原理、使用场景以及如何在实际开发中应用。 首先,理解Looper的...