先说为什么须要Handler:

Android的主线程又叫UI线程,用于处理与UI相关的时间。Android仅仅同意在主线程中改动UI组件,当我们在其它线程中须要改动UI界面时。就须要发送消息到主线程,再由主线程来处理UI的改动事件。

在UI线程中运行耗时操作或网络操作,否则会抛出ANR (“Application Not Responding”)异常或NetworkOnMainThreadExceptionwill异常。

在这些时候。我们用Handler来进行消息的传递和处理。

以下来介绍Handler类:

(1)两个主要功能:

1.在非主线程中发送消息。

2.在主线程中获取、处理消息。

(2)一起工作的几个组件

Message:Handler接收和处理的消息对象

Looper:每一个线程有一个Looper,负责管理MessageQueue。

它的loop方法不断从MessageQueue中抽取Message交给Handler处理。

MessageQueue:由Looper负责管理的消息队列,用FIFO的方式管理Message。

Looper的构造器中会创建一个MessageQueue对象。

(3)Handler用于发送、处理Message的方法:

void handleMessage(Message msg):处理消息的方法,须要自己重写。

boolean hasMessages(int what, Object object):检查消息队列中是否包括what属性为指定值且object属性为指定对象的消息。

boolean hasMessages(int what):检查消息队列中是否包括what属性为指定值的消息。

Message obtainMessage():获取消息。

boolean sendEmptyMessage(int what):发送空消息。

boolean sendEmptyMessageAtTime(int what, long uptimeMillis):在指定的时间发送空消息。

boolean sendEmptyMessageDelayed(int what, long delayMillis):一段时间后发送空消息。

boolean sendMessage(Message msg):发送消息。

boolean sendMessageAtFrontOfQueue(Message msg):消息增加到消息队列的最前面。

boolean sendMessageAtTime(Message msg, long uptimeMillis):在指定时间发送消息。

boolean sendMessageDelayed(Message msg, long delayMillis):一段时间后发送消息。

(4)Handler的消息处理机制:

开发人员须要重写Handler类的消息处理方法。但新启动的线程发送消息时,消息会发送到与之关联的MessageQueue,Handler不断从MessageQueue中获取并处理消息。在此时调用消息处理方法。

(5)利用Handler处理其它线程中须要作出的UI改动:

Android系统在启动的时候会为Activity创建一个消息队列和消息循环(Looper)。为了处理非主线程中的UI处理要求,我们首先在新线程中发送消息,然后在主线程中重写Handler的handleMessage()方法实现UI改动的要求。

Android学习笔记(38):Handler消息传递处理机制的更多相关文章

  1. Android学习笔记(十三)——广播机制

     //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! Android 中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容 ...

  2. android学习笔记38——样式和主题

    Style.Theme 样式和主题资源都是用于android应用的美化操作. 样式:一组格式的集合,可重复使用. android的样式资源存放与res/values文件夹下,其根元素为<reso ...

  3. 【转】 Pro Android学习笔记(八八):了解Handler(2):什么是Handler

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 之前我们有一篇很好的博文<Andro ...

  4. 【转】 Pro Android学习笔记(八九):了解Handler(3):延迟执行小例子

    目录(?)[-] 小例子 Handler的处理 Activity的代码片段 后台线程和UI的互动 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://b ...

  5. 【转】 Pro Android学习笔记(九十):了解Handler(4):Worker线程

    目录(?)[-] worker线程小例子 小例子代码worker线程通过handler实现与主线程的通信 小例子代码继承Handler代码 小例子代码子线程的Runnable 文章转载只能用于非商业性 ...

  6. Android学习笔记之JSON数据解析

    转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

  7. 【转】 Pro Android学习笔记(九二):AsyncTask(1):AsyncTask类

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在Handler的学习系列中,学习了如何h ...

  8. 【转】 Pro Android学习笔记(三三):Menu(4):Alternative菜单

    目录(?)[-] 什么是Alternative menu替代菜单 小例子说明 Alternative menu代码 关于Category和规范代码写法 关于flags 多个匹配的itemId等参数 什 ...

  9. 【转】Pro Android学习笔记(七):了解Content Provider(下上)

    我们通过一个Content Provider小例子进行详细说明.数据源是一个SQLite数据库,名字为books.db,该数据库只含有一个表格,名字为books.表格中含有name,isbn,auth ...

随机推荐

  1. 《JAVA与模式》之单例模式(转载)

    原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿 ...

  2. fork()和写时复制

    写时复制技术最初产生于Unix系统,用于实现一种傻瓜式的进程创建:当发出fork(  )系统调用时,内核原样复制父进程的整个地址空间并把复制的那一份分配给子进程.这种行为是非常耗时的,因为它需要: · ...

  3. 第2章 Python基础-字符编码&数据类型 列表&元祖 练习题

    1.创建一个空列表,命名为names,往里面添加old_driver,rain,jack,shanshan,peiqi,black_girl元素 names = ["old_driver&q ...

  4. 项目记录25--unity-tolua框架 View02---BasePanel.lua

    还在,还在. ... . 每天晚上找点时间写点点,多了也不想学到底是什么心理啊. 写完看电影去. 今天写两个算超完毕了BaseUI.lua,UIManager.lua(完好中这个) local Bas ...

  5. js 社会主义点击事件

    index.js 效果演示地址: https://www.purecss.cn/ (function() { var coreSocialistValues = ["富强", &q ...

  6. VB的一些项目中常用的通用方法-一般用于验证类

    1.VB的一些项目中常用的通用方法: ' 设置校验键盘输入值,数字 Public Function kyd(key As Integer) As Integer Dim mychar mychar = ...

  7. sublime unityshaderplugin

  8. 在Windows系统上怎么使用SecureCRT链接Linux AWS EC2 -摘自网络

    在Windows系统上就需要使用SecureCRT,Putty等工具,进行连接.但是AWS提供的XXX.pem文件,需要做一些处理SecureCRT的方法: 1.使用XXX.pem文件生成一个公钥文件 ...

  9. JDK1.6新特性,基础类库篇,Jar与Zip增强

    1. API改变 增加了两个实现类 java.util.zip.DeflaterInputStream: 此类为解压缩 "deflate" 压缩格式的数据实现流过滤器.它还用作其他 ...

  10. JS 在 IE9 中出现奇怪的错误(参数是必选项 argument not optional)

    最近发现之前运行正常的网站,在 IE9 下会报这个错误.网上查了一下,发现是跟我的方法名字有关... 我起了一个叫做 addFilter 名字的方法,但是很不巧,IE9 里也有一个这个名字的方法,所以 ...