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) : 马上发送消息

第一个方法 我们通常在 相关阅读:
hdu 4333 扩展kmp
扩展KMP
hdu 1026 bfs+记录路径
2015-04-26 校赛总结
hdu 1514 记忆化搜索
hdu 1208 记忆化搜索
hdu 2266 dfs
hdu 1518 dfs+剪枝
android:layout_gravity和android:gravity的区别
深圳市住房公积金提取办法

  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7169335.html
  • 走看看 - 开发者的网上家园

    每个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) : 马上发送消息

    第一个方法 我们通常在 相关阅读:
    hdu 4333 扩展kmp
    扩展KMP
    hdu 1026 bfs+记录路径
    2015-04-26 校赛总结
    hdu 1514 记忆化搜索
    hdu 1208 记忆化搜索
    hdu 2266 dfs
    hdu 1518 dfs+剪枝
    android:layout_gravity和android:gravity的区别
    深圳市住房公积金提取办法

  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7169335.html