zoukankan      html  css  js  c++  java
  • 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) : 马上发送消息

    第一个方法 我们通常在 查看全文

  • 相关阅读:
    centos6搭建docker镜像私服
    CentOS6安装docker
    通过pyenv进行多版本python管理
    ( 转)性能测试--地铁模型分析
    LoadRunner基于HTML-based script和URL-based script方式录制的区别和各自的使用场景
    一道Oracle子查询小练习
    Oracle多表连接查询
    LoadRunner关联通用函数的学习
    Selenium2(WebDriver)总结(五)---元素操作进阶(常用类)
    selenium2(WebDriver) API
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7169335.html
Copyright © 2011-2022 走看看