最近两天在学习android异步处理机制handler,以下是个人对handler的一个自我认识
谈到handler机制,首先我以一幅图来谈谈我对android handler 的认识
A Handler allows you to send and process Message
and Runnable objects associated with a thread's MessageQueue
. Each Handler instance is associated with a single thread and that thread's message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it -- from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue.
以上的一段话说明了handler的一个运行原理,实际上,通过实验,每一个应用程序启动过后,系统会自动为它创建相应的looper对象,looper对象生成messagequeue对象,并将该应用程序所有的activity与messagequeue对象进行相应的绑定,而handler则是与某个生成它的线程绑到一起的,一般是ui线程,handler通过发送message对象到messagequeue对象里面,并通过looper对象的不断循环,以对每个message对象进行相应的处理,以达到异步更新ui线程里面的一些控件。
以下对运行机制的解释
疑问一:
凭什么说该应用程序所有activity只有一个looper对象,一个messagequeue对象?
原因:其实这个问题可以通过实验验证,可以通过调用不同activity方法getMainLooper()对象,其实都是一个,再者messagequeue对象是由looper对象生成,所以当然一样且有一个。(looper对象由系统维护)
疑问二:
从messagequeue队列中出来的message为啥知道调用哪个handler呢?
/**
* User-defined message code so that the recipient can identify
* what this message is about. Each {@link Handler} has its own name-space
* for message codes, so you do not need to worry about yours conflicting
* with other handlers.
*/
public int what;
其实就是这个what,它对接受者进行唯一标识,每个message对象有它自己的命名空间,所以message对象调用handler不会产生冲突。
疑问三:
以上图中的thread与handler有联系吗?
我画的handler对象源于主线程,之所以开子线程是为了在进行一些长时间的操作,如下载,网络操作等,避免出现ANR现象,同时又可以保证实时对ui线程进行控件更新操作(如进度条更新)。所以两者没有必然的联系,看情况而定。
补充:
其实新开的子线程默认是没有looper对象的,所以也就不存在相应的messagequeue对象,如果子线程里面有自己生成的handler对象,那么只有当它里面存在looper对象时,才可进行消息的接收
- 大小: 44.3 KB
分享到:
相关推荐
Handler在android里负责发送和处理消息。它的主要用途有(或者是干什么的): 1)执行计划任务,按计划(定时)发送消息或执行某个Runnanble(使用POST方法); 2)线程间通信,把从其他线程中发送来的消息放入消息...
包括环境搭建教程、创建模拟器、新建helloworld程序、电话拨号器、软件部署到模拟器、短信发送器、线性布局、相对布局、日志、activity、Android进程线程及优先级、Android UI线程阻塞及优化、广播接受者、Service...
一、Handler的定义: 主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是...
在android中有一个规则:考虑到安全性,子线程不能动态的改变主线程中组件的属性值。 但为了执行一些耗时操作,往往会将它们放在子线程中,执行完毕要更新主线程中的UI,所以就有了handler消息处理机制。 handler就...
本篇文章是对在Android中Handler Runnable与Thread的区别进行了详细的分析介绍,需要的朋友参考下
这是Pro Android学习系列中Android Service部分的例子源代码。相关学习笔记见:http://blog.csdn.net/flowingflying/article/details/6212512
xamarin学习笔记A13(安卓Handler异步消息处理)Android中只能在主线程进行UI操作,不能在子线程操作,要根据子线程执行的结果来更新UI时,需要用到安卓异步消息处理机制。
上一次写完Binder学习笔记之后,再去看一遍Activity的启动流程,因为了解了Binder的基本原理,这次看印象会更深一点,学习效果也比以前好很多。本来打算直接来写Activity的启动流程的,但总觉得Handler也需要写一下...
3.android学习笔记--activity生命周期&handler使用 4.android学习笔记--HandlerThread和Bundle 5.android学习笔记--SQLite 6.android学习笔记--下载文件 7.android学习笔记--Content Provider 8.android学习笔记--...
Handler处理机制中,需要Looper来动态的进行循环,以此来不断将MessageQueue的数据取出。 在主线程中,Looper和MessageQueue已经在创建好的,因此我们不用自己创建它们就能用。 而在子线程中,如果我们想用Handler的...
1、查看网络上的图片 2、主线程阻塞-ANR 3、刷新UI-Handler 4、在本地缓存图片-例如微信的图片 5、获取开源代码 6、显示一个新闻客户端 7、使用GET方式提交表单数据 8、使用POST方式提交表单
一本基础的android开发教程,包括了主要Activity,handler等的使用,以及其他基控件的使用。教程内容很清晰
android性能优化整理 android性能优化整理 本人学习使用的笔记 长期更新 欢迎star QQ879689064 Handler产生的内存泄露
个人学习Android的东西,绝对经典,不容错过,或许很多的问题你都会在我这里找到一种似曾相识的感觉,
Android Demo, 学习过程中的一些笔记 chapter3 ~ chapter13 为 「Android 群英传」的 Demo ,做了部分修改并在上面增加了一些注释及评论用于备忘 art_Chapter[chapterNumber] 为 「Android 开发艺术探索」的 Demo ,...
这是一个基于Bmob平台实现的记事本源码,代码中比较详细的注释解释了如何借助Bmob平台强大的后台处理功能实现Android客户端与后台服务器的数据交换。同时案例里面的侧滑菜单、自定义Adapter, ListView, Handler, ...
Understanding LooperLooper是用于给一个线程添加一个消息队列(MessageQueue),并且循环等待,当有消息时会唤起线程来处理消息的一个工具,直到线程结束为止。通常情况下不会用到Looper,因为对于Activity,Service...
本文总结分析了Android中异步类AsyncTask用法。分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独享,一并发在这里与大家共勉...