先说为什么须要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改动的要求。

最新文章

  1. Markdown使用指南(2)—— 键盘符号说明
  2. Android 中的Json解析工具fastjson 、序列化、反序列化
  3. Agile 是什么?
  4. 【nginx】常见的陷阱和错误
  5. Unity重力的测试
  6. python 列表(list)去除重复的元素总结
  7. JAXB - Annotations, Class Fields as Attributes: XmlAttribute
  8. linux-ssh远程后台执行脚本-放置后台执行问题(转)
  9. Maven安装与更新
  10. TRIZ系列-创新原理-21-高速通过原理
  11. Pandas: 如何将一列中的文本拆分为多行? | Python
  12. 《Thinking in Java》学习笔记(三)
  13. java中servletContextListener、httpSessionListener和servletRequestListener使用整理
  14. 【爆料】-《西悉尼大学毕业证书》UWS一模一样原件
  15. wpf 实现 css3 中 boxshadow inset 效果
  16. Notification之适配总结
  17. superset在 centos 7安装运行
  18. 基于Github&Hexo的个人博客搭建过程
  19. Gym 101915
  20. python将字符串类型改成日期类型

热门文章

  1. linux大文件传输
  2. MySQL加载配置文件的顺序
  3. Mapped Statements collection does not contain value for com.xxxx.dao.impl.AreaDAOImpl.findByCode
  4. [转] Spring4.3.x 浅析xml配置的解析过程(6)——解析context命名空间之property-placeholder和property-override标签
  5. MetInfo PHP的CMS,目测还不错
  6. Create rolling monthly, weekly and daily Logstash indices
  7. struts2:JSON在struts中的应用(JSP页面中将对象转换为JSON字符串提交、JSP页面中获取后台Response返回的JSON对象)
  8. 修复 dji spark 的 micro sd/tf 存储卡里不能正常播放的视频文件
  9. Windows 以管理员运行而不提示
  10. sql的split()函数