首页 > 代码库 > Android消息机制

Android消息机制

每个Android应用在启动的时候都会创建一个线程。这个线程被称为主线程或者UI线程。Android应用的全部操作默认都会执行在这个线程中。
可是当我们想要进行数据请求,图片下载。或者其它耗时操作时,是不可能在这个UI线程做的。由于Android在3.0以后的版本号已经禁止了这件事情,直接抛出一个异常。所以我们须要一个子线程来处理那些除UI操作的事情。
可是这个又会有一个问题。我们仅仅能在UI线程进程UI操作,仅仅能在子线程进行耗时操作。假设我们须要在耗时操作结束后在Android界面上显示一个View,我们应该怎么做?我们是不可能在子线程直接刷新UI的。这时我们须要用到Android的消息机制。来实现主线程和子线程的通信。简单来说,就是子线程获取到数据之后,不直接进行UI更新,而是把数据装到消息中发送到主线程,主线程中有一个循环轮询会马上收到子线程发过来的信息,然后拿到消息数据后在主线程更新UI 。说起来比較简单。我们来细致的看一下详细是怎么说的。

处理消息的手段——Handler, Looper, MessageQueue

Handler

我们先解说一下Handler,Handler顾名思义就是处理者,通常对他的使用方法是在UI线程中新建一个Handler,并覆写他的handleMessage, 然后再耗时的线程中将消息postUI线程。样例例如以下:

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