一、研究背景
在学习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的运作。