Handler、Message和Looper之间的关系

  • Post author:
  • Post category:其他



一、研究背景

在学习Android的多线程编程中,发现Android中规定UI的更新只能在主线程中进行,在子线程中是禁止的,但是主线程又不能进行耗时操作。为了解决既能更新UI又能进行耗时操作的需求,从而出现了消息机制、AsyncTask异步任务这两种方式。


二、Android的消息机制

在Android的消息机制中会涉及到Message类、Handler类、Looper类的内容,为了弄清楚它们的使用方法和它们之间的关系,查阅Android的API文档。

Message类

Message的类概述

定义一个message能够将包含描述任意类型的数据

对象发送给一个Handler,这个对象包含了两个额外的int字段和一个额外的对象字段,同时在许多情况下允许你不进行分配这些字段。

在message的构造方法是公有的情况下,使用

Message.obtain()或Handler.obtainMessage()的方法将

message从有可使用对象的池中取出是最好的方式。

Handler类

Handler的类概述

一个Handler允许发送和处理

Message、可获取的对象,将其关联到一个线程的MessageQueue中,每个

Handler实例都是关联到单个线程与该线程的消息队列中,当你创建一个Handler的时候,从那时起它将绑定到创建它的线程或者消息队列上,它将传递

Message到正在运行的MessageQueue上,和当Message从MessageQueue中取出后完成这个过程。

使用

post(Runnable)

,

postAtTime(Runnable, long)

,

postDelayed(Runnable, long)

,

sendEmptyMessage(int)

,

sendMessage(Message)

,

sendMessageAtTime(Message, long)

, 和

sendMessageDelayed(Message, long)方法完成

messages的发送,POST版本允许你在接收到可运行的消息队列对象时对其进行入队。sendMessage版本允许对Message对象进行排队,该Message对象包含将由Handler的handleMessage(Message)方法处理的一捆数据(需要实现Handler的子类)。

当posting 或者sending一个Handler时,你可以允许在消息队列准备就绪时立即处理该项,或者指定在处理该项之前的延迟或处理该项的绝对时间。后两者允许您实现设定时间执行相应的操作。

在为应用程序创建进程时,其主线程专用于运行消息队列,该队列负责管理顶级应用程序对象(活动、广播接收器等)及其创建的任何窗口。您可以创建自己的线程,并通过处理程序与主应用程序线程通信。这是通过调用和以前一样的POST或

sendMessage

方法,但是从新线程中调用。然后,给定的可运行或消息将被安排在处理程序的消息队列中,并在适当的时候进行处理。

Looper类

Looper的类概述

该类用于运行一个消息循环的线程。默认情况下线程没有与之关联的消息循环;若要创建一个消息循环,请在要运行该循环的线程中调用

prepare()

,然后

loop()

使其处理消息,直至循环停止。

一个消息循环的大多数交互是通过Handler类实现的。


三、Handler、Message和Looper之间的关系图



该图表达了Message 需要通过Handler对象将其放入到消息队列中,又是通过Handler对象将其取出的,这一过程的循环需要到Looper的运作。



版权声明:本文为nxc_boy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。