Android looper、handler及HandlerThread

一、简介

  在Android开发中,使用消息队列(message)完成线程间通信。而使用消息队列的线程就是消息循环(message looper)。消息循环不断的检查消息队列,是否有新消息。消息循环是由一个线程和一个looper组成;looper对象管理着线程的消息队列。

  Android的主线程也是一个消息循环,也具有一个Looper,主线程所有的任务都是由looper完成。消息循环是由一个线程和一个looper组成,looper对象管理着线程的消息队列;因此,looper不断的从消息队列中抓取消息,然后完成消息指定的任务。

  PS: 线程默认情况下,是没有消息循环(Looper)的,在Android中,只有主线程默认就是Looper(消息循环)。在新创建的线程中,使用Looper,要先创建一个Looper才行。

二、Message与Handler

  Message与Handler是成对出现的,Message是消息,而Handler是消息要完成任务的对象。

  消息是Message的一个实例,在实现一个消息时,要同时实现Message类的一些实例变量,

    • what: 用户定义的Int类型消息代码,用来描述消息。
    • obj: 随消息一起发送的用户指定的对象,即消息传递的数据。
    • target:完成消息指定任务的目标,即用来完成消息指定任务的对象。

  Handler是完成消息或消息指定任务的对象,Handler不仅是完成消息的目标或对象,也是创建和发布消息(Message)的接口。

                 (图来源于Android权威指南)

  • Looper拥有message的消息队列,所以,message必须在Looper上发布或读取。
  • 一个Handler仅一个Looper相关联,一个Message也仅与一个目标Handler(message目标)相关联。而Looper拥有消息的整个队列。

在看看下面这个图,

              (图来源于Android权威指南)

从上面这个图中,可以看出,有多个Handler与一个Looper相关联,这说明一个Handler的message与另一个Handler的message放于同一个消息队列。

三、Handler使用

  1. 使用Handler.obtainMessage(...)方法会从公共循环消息队列中,获取message。

  2. 使用Handler.sendToTarget()方法,会方法消息发送给与message相关联的Handler。而Handler会将message放于Looper的消息队列尾部。

  3. Looper在消息队列中,获取到特定的消息后,将其发送给消息目标(与之相关联的Handler)去处理。消息一般在Handler(消息目标)的handlerMessage(...)实现方法处理消息指定要完成的任务。一般,要继承Handler基类,覆盖handlerMessage()方法。

四、传递Handler

  Handler类的一个实例,可以作为函数参数,传递给其它子线程。

  主线程拥有一个Handler和Looper消息循环,在线程中,主线程上创建一个Handler,会自动与主线程的Looper相关联。将主线程创建的Handler传递给另一个子线程,传递出去的Handler始终会与创建它的线程的Looper保持联系。因此,任何已传出的Handler负责处理的消息,都将在主线程的消息队列中处理。

  那么,就可以通过这种方式,在子线程中,去更新主线程的事件,数据,或者UI。

五、在新线程中,创建Looper(消息循环)

时间: 2024-10-06 21:32:18

Android looper、handler及HandlerThread的相关文章

安卓权威编程指南-笔记(第24章 Looper Handler 和 HandlerThread)

AsyncTask是执行后台线程的最简单方式,但它不适用于那些重复且长时间运行的任务. 1. Looper Android中,线程拥有一个消息队列(message queue),使用消息队列的线程叫做消息循环(message loop).消息循环会循环检查队列上是否有新消息. 消息循环由线程和looper组成,Looper对象管理着线程的消息队列. 主线程就是个消息循环,因此也拥有Looper,主线程的所有工作都是由其looper完成的,looper不断的从消息队列中抓去消息,然后完成消息指定的

Android 中Message,MessageQueue,Looper,Handler详解+实例

一.几个关键概念 1.MessageQueue:是一种数据结构,见名知义,就是一个消息队列,存放消息的地方.每一个线程最多只可以拥有一个MessageQueue数据结构. 创建一个线程的时候,并不会自动创建其MessageQueue.通常使用一个Looper对象对该线程的MessageQueue进行管理.主线程创建时,会创建一 个默认的Looper对象,而Looper对象的创建,将自动创建一个Message Queue.其他非主线程,不会自动创建Looper,要需要的时候,通过调 用prepar

Android 消息处理机制-Looper,Handler,MessageQueue

先膜拜下大神的帖子,从源码的角度分析android的Handler机制.   链接:android的消息处理机制(图+源码分析)——Looper,Handler,Message 这里就不赘言,仅仅做一些介绍,想看详细请猛戳上面的链接. android的消息机制由三块组成Looper,Handler,MessageQueue.我们知道在android中子线程中是不能够执行组件的更新操作的,既然这样我们只能在子线程中把消息发送给主线程,让主线程自己去更新,这里就会用到Handler.子线程通过调用主

Android的Handler及looper

看了这么多的文章,终于看懂了. 参考文献: [1]android developer handler [2]Android中Handler作用 [3] Android Thread Looper Handler 关系 [4]android的消息处理机制(图+源码分析)--Looper,Handler,Message 1.从定义上理解Handler 首先有一下参考文献[1]中的一句英文句子来说明下: A Handler allows you to send and process Message 

android的消息处理机制(图+源码分析)——Looper,Handler,Message

android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道,因此我没将其作为核心类.下面一一介绍: 线程的魔法师 Looper Looper的字面意思是“循环者”,它被设计用来使一个普通线程变成Looper线程.所谓Looper线程就是循环工作的线程.在程序开发中(尤其是GUI开发中),我们经常会需要一个线程不断循环,一旦有新任务则执行,执行完继续等待下一个任

Android的Handler,Looper源码剖析

之前了解android的消息处理机制,但是源码看的少,现在把Looper,Handler,Message这几个类的源码分析一哈 android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道,因此我没将其作为核心类 Looper源码: Looper的字面意思是"循环者",它被设计用来使一个普通线程变成Looper线程.所谓Looper线程就是循环工作的线

Android -- 消息处理机制源码分析(Looper,Handler,Message)

android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道,因此我没将其作为核心类.下面一一介绍: Looper Looper的字面意思是“循环者”,它被设计用来使一个普通线程变成Looper线程.所谓Looper线程就是循环工作的线程.在程序开发中(尤其是GUI开发中),我们经常会需要一个线程不断循环,一旦有新任务则执行,执行完继续等待下一个任务,这就是Lo

正确理解 AsyncTask,Looper,Handler三者之间的关系(基于android 4.0)

Looper 和Handler 是理解好AsyncTask的一个基础,我们可以先从这里开始,先给出一个主线程和子线程互相通信的例子. 1 package com.example.loopertest; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.os.Looper; 7 import android.os.Message; 8

【转】android的消息处理机制(图+源码分析)——Looper,Handler,Message

原文地址:http://www.cnblogs.com/codingmyworld/archive/2011/09/12/2174255.html#!comments 作为一个大三的预备程序员,我学习android的一大乐趣是可以通过源码学习google大牛们的设计思想.android源码中包含了大量的设计模式,除此以外,android sdk还精心为我们设计了各种helper类,对于和我一样渴望水平得到进阶的人来说,都太值得一读了.这不,前几天为了了解android的消息处理机制,我看了Loo

[Android]Message,MessageQueue,Looper,Handler详解+实例

转http://www.eoeandroid.com/forum-viewthread-tid-49595-highlight-looper.html 一.几个关键概念 1.MessageQueue:是一种数据结构,见名知义,就是一个消息队列,存放消息的地方.每一个线程最多只可以拥有一个MessageQueue数据结构. 创建一个线程的时候,并不会自动创建其MessageQueue.通常使用一个Looper对象对该线程的MessageQueue进行管理.主线程创建时,会创建一 个默认的Loope