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. inno setup 打包

    ; -- Example1.iss -- ; Demonstrates copying files and creating an icon. ; SEE THE DOCUMENTATION FOR ...

  2. POJ 2342 (树形DP)

    Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3863   Accepted: 2172 ...

  3. 【CSS】Beginner4:Text

    1.alter the size and shape of the text 2.font-family:Arial, Verdana,"Times New Roman",helv ...

  4. eclipse tomcat内存溢出,加大内存

    保存图片失败,请点击这里获得详细信息. 加入 -Xms256M -Xmx512M -XX:PermSize=256m -XX:MaxPermSize=512m

  5. POJ 3279 Fliptile (质量不错)

    题意:有一个M*N的棋盘,每一个格子只有两种状态0或1,每次可以选择一个格子执行翻转操作,并且与该格子相邻的4个格子都会被翻转,求将所有格子都翻转成0所需要的最小操作数,若有多种方案,输出字典序最小的 ...

  6. 《Concrete Mathematics》-chaper5-二项式系数

    二项式系数,也是我们常用的组合数,最直观的组合意义就是从n个元素取k个元素所有可能的情况数,因此我们自然的得到下面二项式系数的定义式. 那么我们通过具有组合意义的二项系数,给出更加一般的二项式系数的定 ...

  7. POJ1838

    poj 1838 这道题主要是对并查集的考察,在这道题的解题过程中主要用到的算法就是并查集中的最基本的makeSet,findSet,unionSet 即前篇文章中所提到的: makeSet(Elem ...

  8. poj 2325 Persistent Numbers (贪心+高精度)

    把输入数字每次从9-2除,能整除则记录该数字,最后从小到大输出. 应该算是水题,不过窝第一次写高精度除法,虽然1A,不过中间改了好多次. /****************************** ...

  9. Spring mvc Interceptor 解决Session超时配置流程

    最近公司内部框架中对Session超时这一功能未实现,由于采用iframe结构,Session超时后,当点击左侧系统菜单时,会在iframe的右侧再次弹出登陆框. 该问题是由于没有设置拦截器造成. 添 ...

  10. nginx redis tomcat 分布式web应用 session共享

    目标:多台tomcat 使用redis实现共享session.redis的安装请参阅:centos上安装redis nginx 作为目前最流行的开源反向代理HTTP Server,用于实现资源缓存.w ...