Handler 、 Looper 、Message 这三者都与Android异步消息处理线程相关的概念。
那么什么叫异步消息处理线程呢?
异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次,从其内部的消息队列中取出一个消息,然后回调相应的消息处理函数,执行完成一个消息后则继续循环。若消息队列为空,线程则会阻塞等待。
 
 
 
详细总结:::
前提,主线程ui,只能刷新页面和处理事件;耗时的数据处理都在子线程中。。。
那么子线程的数据如何同步到主线程?
那就需要异步消息处理机制Handler 、 Looper 、Message:::
1 子线程hander.sendMessage()发送message消息,加入到主线程的消息队列,
同时Handler必须对应一个looper对象,主线程ui创建的时候,包含一个Looper对象。
Handler的构造函数中,会把当前ui线程的Looper与Handler关联。
2 Looper构造函数中创建MessageQueue消息队列对象,loop()方法不断的循环遍历从消息队列中取出子线程发送来的对应消息,回调处理handlerMessage。
3 多线程处理handler的时候,容易造成内存泄漏。。。
4 正因为基于消息队列Looper的先进先出形式,所以不会造成阻赛。。。
5 Activity中的UI主线程中,无需使用显式的方式进行Looper的初始化以及开始循环,是因为Activity内部包含一个Looper对象,它会自动管理Looper,处理子线程中发送过来的消息。
6 子线程thread想管理消息队列,需要在线程当中调用Looper.prepare()方法使消息循环初始化,并且调用Looper.loop()使消息循环一直处于运行状态,直到停止循环。所以Looper主要就是完成MessageQueue与Handler进行交互的功能。
 
 
更简单说法::::
Android只允许主线程更新UI界面(非线程安全的),子线程处理后的结果,即无法直接访问主线程,这就要用到Handler机制来解决此问题.
基于Handler机制,在子线程先获得Handler对象,该对象将数据发送到主线程消息队列,Main线程通过MainLooper从消息队列中取出Handler发过来的这个消息时,会回调 Handler的handlerMessage()方法。
 
 
Handler.post(new Runnable())和sendmessage(msg)区别和runOnUiThread()方法
(1)  都是把消息放到消息队列等待执行,前者放的是一个runnable对象,后者是一个message对象;
(2)  前者最终还是会转化成sendMessage,只不过最终的处理方式不一样,前者会执行runnable的run方法;后者可以被安排到线程中执行。
(3)  两者本质没有区别,都可以更新UI,区别在于是否易于维护等。
 
 
HandlerThread是什么
HandlerThread继承了Thread,是一个包含有looper的线程类。正常情况下,除了主线程,工作线程是没有looper的,但是为了像主线程那样也能自动循环处理消息,Android也自定义一个包含looper的工作线程——HandlerThread类。
IntentService里面就包括了HandlerThread,所以才能实现消息队列 循环处理消息,而不阻赛。
 
 
注意:::
UI主线程是非线程安全的,负责页面刷新,响应事件
单线程模型的UI主线程也是不安全的,会造成不可确定的结果。
线程不安全简单理解为:多线程访问资源时,有可能出现多个线程先后更改数据造成数据不一致。
线程安全简单理解为:当一个线程访问功能资源时,对该资源进程了保护,比如加了锁机制,当前线程在没有访问结束释放锁之前,其他线程只能等待直到释放锁才能访问,这样的线程就是安全的。
Android的单线程模型必须遵守两个规则:
1.  不要阻塞UI线程;
2.  不要在UI线程之外访问UI组件,即不能在子线程访问UI组件,只能在UI线程访问。
3 耗时的都放到子线程处理,因为UI线程优先级和其他普通线程一样。被阻塞超过5秒 ,会提示ANR。
 

Handler 、 Looper 、Message异步消息处理线程机制( hander消息机制原理)的更多相关文章

  1. Android消息机制探索(Handler,Looper,Message,MessageQueue)

    概览 Android消息机制是Android操作系统中比较重要的一块.具体使用方法在这里不再阐述,可以参考Android的官方开发文档. 消息机制的主要用途有两方面: 1.线程之间的通信.比如在子线程 ...

  2. Atitit.事件机制 与 消息机制的联系与区别

    Atitit.事件机制 与 消息机制的联系与区别 1. 消息/事件机制是几乎所有开发语言都有的机制,在某些语言称之为消息(Event),有些地方称之为(Message).1 2. 发布/订阅模式1 3 ...

  3. Android之消息机制Handler,Looper,Message解析

    PS:由于感冒原因,本篇写的有点没有主干,大家凑合看吧.. 学习内容: 1.MessageQueue,Looper,MessageQueue的作用. 2.子线程向主线程中发送消息 3.主线程向子线程中 ...

  4. Android中的Handler,Looper,Message机制

    Android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道,因 ...

  5. hander消息机制原理(looper轮询监听机制)

    基本原理 线程中调用Handler.sendMsg()方法(参数是Message对象),将需要Main线程处理的事件 添加到Main线程的MessageQueue中,Main线程通过MainLoope ...

  6. android学习日记25--ANR和Hander消息机制

    1.ANR(Application Not Responding)定义 在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:A ...

  7. hander消息机制原理

    基本原理 线程中调用Handler.sendMsg()方法(参数是Message对象),将需要Main线程处理的事件 添加到Main线程的MessageQueue中,Main线程通过MainLoope ...

  8. 【转】Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自[张鸿洋的博客] 很多人面试肯定都被问到过,请问Andr ...

  9. Android 异步消息处理机制 让你在深入了解 Looper、Handler、Message之间的关系

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自[张鸿洋的博客] 非常多人面试肯定都被问到过,请问And ...

随机推荐

  1. boost-智能指针

    使用boost的智能指针需要包含头文件"boost/smart_ptr.hpp",c++11中需要包含头文件<memory> 1.auto_ptr.scoped_ptr ...

  2. 1143 Lowest Common Ancestor

    The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U ...

  3. day33(sql)

    操作数据库 增: create database 数据库名 character set utf8 删 drop database 数据库名称 改 alter database 数据库名称 charac ...

  4. C++ 中的continue理解

    continue的在循环中的作用: 1. 跳过当前循环,但是还需要执行自增条件, 如下程序:当i == 3时,执行i++, 即if判定{}执行完毕,则i==4, 然后 for最后一条语句i++, 然后 ...

  5. 《mysql必知必会》学习_第10章_20180731_欢

    第10章,计算字段. P64 select concat (vend_name,'(',vend_country,')') from vendors order by vend_name; # 拼接, ...

  6. python全栈学习1.开课介绍

    python————web  && 爬虫 Django pyramid Tornado Bottle Flask GUI图形开发 QT 想要类似于执行shell脚本一样执行python ...

  7. 2-Sat小结

    关于2-sat,其实就是一些对于每个问题只有两种解,一般会给出问题间的关系,比如and,or,not等关系,判定是否存在解的问题.. 具体看http://blog.csdn.net/jarjingx/ ...

  8. 微擎开启redis memcache

    微擎开启redis memcache 2018年01月20日 14:39:54 luogan129 阅读数:2161更多 个人分类: 微信开发   版权声明:本文为博主原创文章,未经博主允许不得转载. ...

  9. Kali Linux渗透测试实战 2.2 操作系统指纹识别

    目录 2.2 操作系统指纹识别 2.2.1 Banner抓取 2.2.2 TCP 和 ICMP 常规指纹识别技术 TCP数据报格式 ICMP首部格式 TTL与TCP窗口大小 FIN探测 BOGUS f ...

  10. [C# 开发技巧]如何防止程序多次运行

    一.引言 最近发现很多人在论坛中问到如何防止程序被多次运行的问题的,如: http://social.msdn.microsoft.com/Forums/zh-CN/6398fb10-ecc2-4c0 ...