关于Handler与异步消息处理循环的摘抄
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与异步消息处理循环的摘抄的更多相关文章
- Android多线程----异步消息处理机制之Handler详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Android之Handler(异步消息处理)机制
1. 概述 Handler . Looper .Message 这三者都与Android异步消息处理线程相关的概念.那么什么叫异步消息处理线程呢?异步消息处理线程启动后会进入一个无限的循环体之中,每循 ...
- 【转】Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自[张鸿洋的博客] 很多人面试肯定都被问到过,请问Andr ...
- Android 异步消息处理机制 让你在深入了解 Looper、Handler、Message之间的关系
转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自[张鸿洋的博客] 非常多人面试肯定都被问到过,请问And ...
- Android线程之异步消息处理机制(二)——Message、Handler、MessageQueue和Looper
异步消息处理机制解析 Android中的异步消息处理主要有四个部分组成,Message.Handler.MessageQueue和Looper. 1.Message Message是在线程之间传递的消 ...
- Android 异步消息处理机制终结篇 :深入理解 Looper、Handler、Message、MessageQueue四者关系
版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.概述 我们知道更新UI操作我们需要在UI线程中操作,如果在子线程中更新UI会发生异常可能导致崩溃,但是在UI线程中进行耗时操作又会导致ANR,这 ...
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
转自:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自[张鸿洋的博客] 很多人面试肯定都被问到过,请问Android中的 ...
- Handler 、 Looper 、Message异步消息处理线程机制( hander消息机制原理)
Handler . Looper .Message 这三者都与Android异步消息处理线程相关的概念. 那么什么叫异步消息处理线程呢? 异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次, ...
- 异步消息处理机制Handler
Android 中的异步消息处理主要由四个部分组成,Message.Handler.MessageQueue 和Looper. 1. Message Message 是在线程之间传递的消息,它可以在内 ...
随机推荐
- WCF 第五章 会话级别的实例
会话在分布式应用程序中广泛用于维护每个用户的状态.在站点或者基于站点的应用中,将每个用户的状态存储于会话中很常见.这这些情况中,用户和会话间有一个1:1比例.WCF以一个类似的概念支持服务.使用Ins ...
- java反编译工具
由于JAVA语言安全性高.代码优化.跨平台等特性,从1995年5月由SUN公司发布后,迅速取代了很多传统高级语言,占据了企业级网络应用开发等诸多领域的霸主地位. 不过,JAVA最突出的跨平台优势使得它 ...
- Storm系列(三)Topology提交过程
提交示例代码: 1 ); // 设置一个ack线程 9 conf.setDebug(true); // 设置打印所有发送的消息及系统消息 10 StormSubmitter.su ...
- linux进程,作业,守护进程,进程间同步
ps axj命令查看系统中的进程.参数a表示不仅列当前用户的进程,也列出所有其他用户的进程,参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程,参数j表示列出与作业控制相关的信息: 凡是TP ...
- mongodb在java驱动包下的操作(转)
推荐几章很有用的文章 java操作参考文档 http://www.cnblogs.com/hoojo/archive/2011/06/02/2068665.html http://blog.csdn. ...
- ADODB.Connection 错误 '800a0e7a' 未找到提供程序 该程序可能未正确安装
今天调程序的时候发现的,错误提示如下: ADODB.Connection 错误 '800a0e7a' 未找到提供程序.该程序可能未正确安装. /conn.asp,行 6 因为系统是64位的win7或w ...
- Java空字符串与null的区别和判断字符串是否为空的方法
Java空字符串与null的区别: 1.类型null表示的是一个对象的值,而并不是一个字符串.例如声明一个对象的引用,String a = null ;""表示的是一个空字符串,也 ...
- Unity手游之路<六>游戏摇杆之Easy Touch 3教程
之前已经介绍过Unity自带的摇杆Joystick,它用起来很简单.但是它也存在很多局限,不能全部满足普通mmo手游的一些需求,例如:要能方便地更好素材:能指定在某个区域显示,或者只有在该区域触摸时才 ...
- 网络爬虫之Windows环境Heritrix3.0配置指南
一.引言: 最近在忙某个商业银行的项目,需要引入外部互联网数据作为参考,作为技术选型阶段的工作,之前已经确定了中文分词工具,下一个话题就是网络爬虫的选择,目标很明确,需要下载一些财经网站的新闻信息,然 ...
- -bash: ls: command not found
在iMac下ls既然command not found,查找了下 原因:在设置环境变量时,编辑profile文件没有写正确,导致在命令行下 ls等命令不能够识别.解决方案: 直接在控制台下 expo ...