为什么要有handler机制?

在Android的UI开发中,我们经常会使用Handler来控制主UI程序的界面变化。有关Handler的作用,我们总结为:与其他线程协同工作,接收其他线程的消息并通过接收到的消息更新主UI线程的内容。

我们假设在一个UI界面上面,有一个按钮,当点击这个按钮的时候,会进行网络连接,并把网络上的一个字符串拿下来显示到界面上的一个 TextView上面,这时就出现了一个问题,如果这个网络连接的延迟过大,可能是10秒钟甚至更长,那我们的界面将处于一直假死状态,而如果这段时间超 过5秒钟的话,程序会出现异常。

这时我们会想到使用线程来完成以上工作,即当按钮被按下的时候新开启一个线程来完成网络连接工作,并把得到的结果更新到UI上面。但是,这时候又会 出现另一个问题,在Android中,主线程是非线程安全的,也就是说UI的更新只能在本线程中完成,其他线程无法直接对主线程进行操作。

为了解决以上问题,Android设计了Handler机制,由Handler来负责与子线程进行通讯,从而让子线程与主线程之间建立起协作的桥梁,使Android的UI更新的问题得到完美的解决。

Handler的工作原理

一般情况下,在主线程中我们绑定了Handler,并在事件触发上面创建新的线程用于完成某些耗时的操作,当子线程中的工作完成之后,会对Handler发送一个完成的信号,而Handler接收到信号后,就进行主UI界面的更新操作。

andriod提供了 Handler 和 Looper 来满足线程间的通信。

  Handler 先进先出原则。
  Looper类用来管理特定线程内对象之间的消息交换(Message Exchang搜索e)。
  1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
  2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。
  3) Message Queue(消息队列):用来存放线程放入的消息。
  4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。

Android程序启动后会起一个进程,所有的组件都在这个进程里面运行。开始这个进程只包含一个线程(备注进程怎么能包含线程,我认为说法有误),叫做UI主线程,负责处理UI界面的显示更新。对于一些费时的操作(超过5S会卡顿)需要单独启动一个子线程去处理。子线程处理完毕将结果通知给UI主线程,主线程得到结果后更新UI界面。子线程与UI主线程的通信在android中使用了消息机制来完成,那么是怎么完成的呢?这就和handler 机制的原理,简而言之言而总之,就是需要两样样古老的东西,消息队列、轮询。也就是说,主线程起来以后有一个消息队列,同时和该队列配对的有一个轮询,而子线程有这个消息队列的引用,那这样,子线程处理完以后就会向主线程的消息队列发消息,主线程轮询自己的队列,发现有未处理的消息就进行处理。

最新文章

  1. 感悟:搞了整整一天,拯救一个Ubuntu系统
  2. c/c++常用网址
  3. 解决Tomcat无法shutdown进程
  4. Ninject的使用
  5. (六) 6.3 Neurons Networks Gradient Checking
  6. 正则 提取html标签value
  7. select的onChange事件问题解决
  8. Python拼接多张图片
  9. 问题与对策:CSS的margin塌陷(collapse)
  10. WLLCM这五个字母全排列数目
  11. 委托、 Lambda表达式和事件——Lambda表达式
  12. 使用可以为 null 的类型
  13. python爬虫解决gbk乱码问题
  14. Linux学习之CentOS(十七)-----释放 Linux 系统预留的硬盘空间 与Linux磁盘空间被未知资源耗尽 (转)
  15. JavaScript对象的指向问题
  16. SLAM+语音机器人DIY系列:(四)差分底盘设计——1.stm32主控硬件设计
  17. 数据库原理 - 序列4 - 事务是如何实现的? - Redo Log解析(续)
  18. Linux(Ubuntu)使用日记------Mysql编码(utf-8)的设置
  19. RN截图并且下载问题
  20. mui-H5获取当前手机通讯录

热门文章

  1. C++ new 的用法
  2. Coderfroces 862 C. Mahmoud and Ehab and the xor
  3. Huawei配置两台交换机堆叠示例
  4. ajax的几个面试题
  5. 详解如何在vue项目中引入饿了么elementUI组件
  6. Spring MVC学习总结(5)——SpringMVC项目关于安全的一些配置与实现方式
  7. HDU——T 3072 Intelligence System
  8. AVEVA PDMS to 3ds Max - RvmTranslator6.0beta
  9. Easy mock - 安装配置和基本使用
  10. terminfo 数据库?