Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue 统一队列,终由Handler处理。

  Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现 handlerMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。          

MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。 当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的, 等待Looper的抽取。

  Looper:消息泵,不断地从MessageQueue中抽取Message执行。因此一个MessageQueue 需要一个Looper Thread:线程,负责调度整个消息循环,即消息循环的执行场所。

  Android系统的消息队列和消息循环都是针对具体线程的,一个线程可以存在(当然 也可以不存在)一个消息队列和一个消息循环(Looper),特定线程的消息只能分发给 本线程,不能进行跨线程,跨进程通讯。但是创建的工作线程默认是没有消息循环和 消息队列的,如果想让该线程具有消息队列和消息循环,需要在线程中首先调用 Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环。

public void run() {

   Looper.prepare();//给线程创建一个消息循环

  mHandler = new Handler() {

       public void handleMessage(Message msg) {      // process incoming messages here     }   };

    Looper.loop();//使消息循环起作用,从消息队列里取消息,处理消息   }

}

  一个Message经由Handler的发送,MessageQueue的入队,Looper的抽取,又再一次地 回到Handler的怀抱,经过这一圈,将同步操作变成异步操作。 Handler的作用是把消息加入到特定的(Looper)消息队列中,并分发和处理该消息队列 中的消息。构造Handler的时候可以指定一个Looper对象,如果不指定则利用当前 线程的Looper创建。 一个Activity中可以创建多个工作线程或者其它的组件,如果这些线程或组件把它们 的消息放入Activity的主线程消息队列,那么该消息就会在主线程中处理了。 因为主线程一般负责界面的更新操作。 另外一个线程怎样把消息放入主线程的消息队列呢?是通过Handler对象,只要 Handler对象以主线程的Looper创建,那么调用Handler的sendMessage等接口,将 会把消息放入主线程的消息队列。

  在主线程(UI线程)里,如果创建Handler时不传入Looper对象,那么将直接使用主线程 的Looper对象(系统已经帮我们创建了);在其它线程里,如果创建Handler时不传入 Looper对象,那么,这个Handler将不能接收处理消息。

    new Thread(new Runnable() {

      @Override

     public void run() {

                                  Looper.prepare();

             Toast.makeText(LoginActivity.this,"ssss",Toast.LENGTH_SHORT).show();

              Looper.loop();

}

}).start();

  为线程准备好一个Looper(Looper.prepare),然后让这个Looper跑起来(Looper.loop) ,抽取Message,这样Handler才能正常工作。 因此,Handler处理消息总是在创建Handler的线程里运行。而我们的消息处理中, 不乏更新UI的操作,不正确的线程直接更新UI将引发异常。因此,需要时刻关心 Handler在哪个线程里创建的。

   以下,4种方式可以从其它线程访问UI线程:

  Activity.runOnUiThread(Runnable)

  View.post(Runnable)

  View.postDelayed(Runnable,long)

  Handler

  在post方法里,View获得当前线程(即UI线程)的Handler,然后将action对象post到 Handler里,它将传递过来的action对象包装成一个Message(Message的callback为 action),然后将其投入到UI线程的消息循环中。在Handelr再次处理该Message 时,直接调用runnable的run方法。 一个Looper对应一个MessageQueue 一个线程对应一个Looper 一个Looper可以对应多个Handler 不确定当前线程时,更新UI尽量调用Post方法。

关于Handler与异步消息处理循环的摘抄的更多相关文章

  1. Android多线程----异步消息处理机制之Handler详解

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  2. Android之Handler(异步消息处理)机制

    1. 概述 Handler . Looper .Message 这三者都与Android异步消息处理线程相关的概念.那么什么叫异步消息处理线程呢?异步消息处理线程启动后会进入一个无限的循环体之中,每循 ...

  3. 【转】Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自[张鸿洋的博客] 很多人面试肯定都被问到过,请问Andr ...

  4. Android 异步消息处理机制 让你在深入了解 Looper、Handler、Message之间的关系

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自[张鸿洋的博客] 非常多人面试肯定都被问到过,请问And ...

  5. Android线程之异步消息处理机制(二)——Message、Handler、MessageQueue和Looper

    异步消息处理机制解析 Android中的异步消息处理主要有四个部分组成,Message.Handler.MessageQueue和Looper. 1.Message Message是在线程之间传递的消 ...

  6. Android 异步消息处理机制终结篇 :深入理解 Looper、Handler、Message、MessageQueue四者关系

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.概述 我们知道更新UI操作我们需要在UI线程中操作,如果在子线程中更新UI会发生异常可能导致崩溃,但是在UI线程中进行耗时操作又会导致ANR,这 ...

  7. Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系

    转自:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自[张鸿洋的博客] 很多人面试肯定都被问到过,请问Android中的 ...

  8. Handler 、 Looper 、Message异步消息处理线程机制( hander消息机制原理)

    Handler . Looper .Message 这三者都与Android异步消息处理线程相关的概念. 那么什么叫异步消息处理线程呢? 异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次, ...

  9. 异步消息处理机制Handler

    Android 中的异步消息处理主要由四个部分组成,Message.Handler.MessageQueue 和Looper. 1. Message Message 是在线程之间传递的消息,它可以在内 ...

随机推荐

  1. WebService的优点和基本原理

    WebService简介(1)WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应 ...

  2. FZU 2233 ~APTX4869 贪心+并查集

    分析:http://blog.csdn.net/chenzhenyu123456/article/details/51308460 #include <cstdio> #include & ...

  3. HDU 5651 xiaoxin juju needs help 水题一发

    分析:求一下组合数 首先,如果不止一个字符出现的次数为奇数,则结果为0. 否则,我们把每个字符出现次数除2,也就是考虑一半的情况. 那么结果就是这个可重复集合的排列数了. fact(n)/fact(a ...

  4. [转]ASP.NET MVC 入门2、项目的目录结构与核心的DLL

    我们新建一个ASP.NET MVC的Web Application后,默认的情况下,项目的目录结构如下: App_Data :这个目录跟我们一般的ASP.NET website是一样的,用于存放数据. ...

  5. 树莓PI安装web服务器

    参考:http://www.eeboard.com/bbs/forum.php?mod=viewthread&tid=27383 http://www.eeboard.com/bbs/thre ...

  6. zookeeper环境的搭建

    接管条件:磁盘上原数据完全一样,而自动接管,则是由zookeeper 实现的 FailloverController:控制namenode状态:检查namenode:通过远程协议

  7. PHP中的empty()和isset()的比较

  8. 【解决】exited with a non-zero exit code 1

      安装好集群后运行hadoop-mapreduce-examples.jar 报错,比对cdh配置后,发现少了yarn.application.classpath,conf目录一定要配置,否则也会出 ...

  9. CMDB, 配置管理数据库, ITIL - ManageEngine ServiceDesk Plus

    Download Bitnami Review Board Stack click here CMDB, 配置管理数据库, ITIL - ManageEngine ServiceDesk Plus

  10. (一)Memcached初学教程之安装服务篇(Windows下)

    1.下载Memcached的Windows服务安装程序(备注:memcached官网:http://memcached.org/ ,没有提供windows下的安装包,只有UNIX下的安装包,我们这里用 ...