首页 > 代码库 > Android消息机制
Android消息机制
每个Android应用在启动的时候都会创建一个线程。这个线程被称为主线程或者U
I线程。Android应用的全部操作默认都会执行在这个线程中。
可是当我们想要进行数据请求,图片下载。或者其它耗时操作时,是不可能在这个UI
线程做的。由于Android在3.0以后的版本号已经禁止了这件事情,直接抛出一个异常。所以我们须要一个子线程来处理那些除UI
操作的事情。
可是这个又会有一个问题。我们仅仅能在UI
线程进程UI
操作,仅仅能在子线程进行耗时操作。假设我们须要在耗时操作结束后在Android界面上显示一个View,我们应该怎么做?我们是不可能在子线程直接刷新UI
的。这时我们须要用到Android的消息机制。来实现主线程和子线程的通信。简单来说,就是子线程获取到数据之后,不直接进行UI
更新,而是把数据装到消息中发送到主线程,主线程中有一个循环轮询会马上收到子线程发过来的信息,然后拿到消息数据后在主线程更新UI
。说起来比較简单。我们来细致的看一下详细是怎么说的。
处理消息的手段——Handler, Looper, MessageQueue
Handler
我们先解说一下Handler,Handler顾名思义就是处理者,通常对他的使用方法是在UI
线程中新建一个Handler
,并覆写他的handleMessage
, 然后再耗时的线程中将消息post
给UI
线程。样例例如以下:
class MyHandler extends Handler{
@Override
public void handleMessage(Message msg){
//更新UI
}
}
MyHandler mHandler = new MyHandler();
new Thread(){
public void run(){
mHandler.sendEmptyMessage(123);
};
}.start();
这里规定了Handler
必须在主线程创建。由于仅仅有在UI
线程创建才会让Handler
关联到已有的MessageQueue
。
而MessageQueue
被封装到Looper
中,而Looper
又通过ThreadLocal
封装到一个线程中。最后相当于MessageQueue
关联了一个线程。所以简单来说就是Handler将消息投递到一个关联了线程的MessageQueue
中,然后Handler
在从MessageQueue
中取出消息,而且处理它。
我们看一下Handler的2个经常使用的方法
void handleMessage(Message msg) :
处理消息的方法final boolean sendMessage(Message msg) :
马上发送消息
第一个方法 我们通常在
adl get open float one