先说为什么须要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. Docker Dockerfile简述

    原文地址:https://www.cnblogs.com/cuimiemie/p/6442677.html 作用 Dockerfile的内容是一坨可以执行的代码(或者说是指令)(docker的DSL) ...

  2. Android 自定义可拖拽View,界面渲染刷新后不会自动回到起始位置

    以自定义ImageView为例: /** * 可拖拽ImageView * Created by admin on 2017/2/21. */ public class FloatingImageVi ...

  3. [ACM] hdu 1253 胜利大逃亡 (三维BFS)

    胜利大逃亡 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这但是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,能够被表示 ...

  4. 解决tomcat服务器下,只能通过localhost,而不能通过127.0.0.1或者本地ip地址访问的问题

    今天在tomcat上部署了一个web应用以后,发现用localhost的方式来访问应用是正常的,但是换成127.0.0.1或者是本地的ip地址来访问,确出现访问不了的情况.之前想是不是防火墙的问题,于 ...

  5. Android基本功:异步任务(AsyncTask)

    一.解决新线程无法更新UI组建问题的方案 为了解决新线程不能更新UI组建的问题,Andorid提供了如下几种解决方案: 使用Handler实现线程之间的通信. Activity.runOnUiThre ...

  6. js 什么是深拷贝问题?

    一.什么是值类型? 二.什么是引用类型? 三.使用ES Next新特性带来的 Object.assign 方法 和 扩展运算符: 四.Object.assign 方法 和 扩展运算符的 “深入浅出” ...

  7. unfolding maps支持中文

    由于项目需要,选择了processing+unfolding的方式进行数据可是话的开发,unfolding maps是一个非常强大的地图工具,processing可以灵活自如的表达各种图形/效果.使用 ...

  8. MongoDB索引相关文章-摘自网络

    索引类型 虽然MongoDB的索引在存储结构上都是一样的,但是根据不同的应用层需求,还是分成了唯一索引(unique).稀疏索引(sparse).多值索引(multikey)等几种类型. 唯一索引 唯 ...

  9. 参数化查询 '(@ActualShipTime datetime' 需要参数 @AuthorizationNumber,但未提供该参数。

    转自 http://www.cnblogs.com/cxd4321/archive/2012/08/09/2629716.html 在平时的C#项目开发中,当调用某个存储过程或函数的时候,我们可能经常 ...

  10. Atitit 项目管理 提升开发效率的项目流程方法模型 哑铃型  橄榄型 直板型

    Atitit 项目管理 提升开发效率的项目流程方法模型 哑铃型  橄榄型 直板型 项目主体三个部分 ui界面,中间层,数据库 按照不同的比重可以分为一下三个模型  哑铃型  橄榄型 直板型 哑铃型 开 ...