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. windows log

    http://technet.microsoft.com/zh-CN/sysinternals http://technet.microsoft.com/en-us/sysinternals/bb89 ...

  2. SSO单点登录解决方案[转载]

    1 什么是单点登陆      单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互 ...

  3. FFT矩阵

    举个例子: \[{F_4}=\left[{\begin{array}{*{20}{c}}1&1&1&1\\1&i&{-1}&{-i}\\1&{- ...

  4. wuzhicms查找:当前页面使用的哪个文件

    要查看这个地址的模版.http://www.wuzhicms.com/item-34-2-1.html 首先,我们的这个地址需要是动态的.而不是生成的静态地址. 打开文件: /www/configs/ ...

  5. 洛谷P1238 走迷宫

    洛谷1238 走迷宫 题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个 ...

  6. codeforce 621A Wet Shark and Odd and Even

    水 最大偶数和 #include<iostream> #include<string> #include<algorithm> #include<cstdli ...

  7. HDU1671 - Phone List(Trie树)

    题目大意 给定一些电话号码,判断是否有电话号码是其他电话号码的前缀 题解 裸Trie树嘛~~~~只需要一个插入过程即可,假设X是Y的前缀,在插入的过程中有两种情况,X在Y之前插入,那么在插入Y的时候经 ...

  8. UVa1424–Salesmen(DP)

    题目大意 给定一个包含n(n<=100)个点的无向连通图和一个长度为L的序列A(L<=200),你的任务是修改尽量少的数,使得序列中的任意两个相邻的数或者相同,或者对应图中两个相邻结点 题 ...

  9. XI.spring的点点滴滴--IObjectFactoryPostProcessor(工厂后处理器)

    承接上文 IObjectFactoryPostProcessor(工厂后处理器)) 前提是实现接口的对象注册给当前容器 直接继承的对象调用这个postProcessBeanFactory方法,参数为工 ...

  10. PAT 1075. PAT Judge (25)

    题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1075 此题主要考察细节的处理,和对于题目要求的正确理解,另外就是相同的总分相同的排名的处理一定 ...