`
javapolo
  • 浏览: 130233 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

android 笔记handler

 
阅读更多

 

       最近两天在学习android异步处理机制handler,以下是个人对handler的一个自我认识

       谈到handler机制,首先我以一幅图来谈谈我对android handler 的认识

 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
分享到:
评论
1 楼 amanda7783 2014-10-10  

相关推荐

    android_handler学习笔记

    Handler在android里负责发送和处理消息。它的主要用途有(或者是干什么的):  1)执行计划任务,按计划(定时)发送消息或执行某个Runnanble(使用POST方法);  2)线程间通信,把从其他线程中发送来的消息放入消息...

    Android学习笔记.pdf

    包括环境搭建教程、创建模拟器、新建helloworld程序、电话拨号器、软件部署到模拟器、短信发送器、线性布局、相对布局、日志、activity、Android进程线程及优先级、Android UI线程阻塞及优化、广播接受者、Service...

    Android开发笔记 Handler使用总结

    一、Handler的定义: 主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是...

    android学习笔记之handler消息处理机制1

    在android中有一个规则:考虑到安全性,子线程不能动态的改变主线程中组件的属性值。 但为了执行一些耗时操作,往往会将它们放在子线程中,执行完毕要更新主线程中的UI,所以就有了handler消息处理机制。 handler就...

    Android开发笔记之:Handler Runnable与Thread的区别详解

    本篇文章是对在Android中Handler Runnable与Thread的区别进行了详细的分析介绍,需要的朋友参考下

    Pro Android学习:了解Handler小例子

    这是Pro Android学习系列中Android Service部分的例子源代码。相关学习笔记见:http://blog.csdn.net/flowingflying/article/details/6212512

    xamarin学习笔记A13(安卓Handler异步消息处理)

    xamarin学习笔记A13(安卓Handler异步消息处理)Android中只能在主线程进行UI操作,不能在子线程操作,要根据子线程执行的结果来更新UI时,需要用到安卓异步消息处理机制。

    Android Handler机制的工作原理详析

    上一次写完Binder学习笔记之后,再去看一遍Activity的启动流程,因为了解了Binder的基本原理,这次看印象会更深一点,学习效果也比以前好很多。本来打算直接来写Activity的启动流程的,但总觉得Handler也需要写一下...

    android学习笔记

    3.android学习笔记--activity生命周期&handler使用 4.android学习笔记--HandlerThread和Bundle 5.android学习笔记--SQLite 6.android学习笔记--下载文件 7.android学习笔记--Content Provider 8.android学习笔记--...

    Android学习笔记之Handler处理机制的Looper

    Handler处理机制中,需要Looper来动态的进行循环,以此来不断将MessageQueue的数据取出。 在主线程中,Looper和MessageQueue已经在创建好的,因此我们不用自己创建它们就能用。 而在子线程中,如果我们想用Handler的...

    android 学习笔记5-线程阻塞 UI更新

    1、查看网络上的图片 2、主线程阻塞-ANR 3、刷新UI-Handler 4、在本地缓存图片-例如微信的图片 5、获取开源代码 6、显示一个新闻客户端 7、使用GET方式提交表单数据 8、使用POST方式提交表单

    Android开发教程&笔记

    一本基础的android开发教程,包括了主要Activity,handler等的使用,以及其他基控件的使用。教程内容很清晰

    Android代码-Android-performance-optimization

    android性能优化整理 android性能优化整理 本人学习使用的笔记 长期更新 欢迎star QQ879689064 Handler产生的内存泄露

    Android学习笔记

    个人学习Android的东西,绝对经典,不容错过,或许很多的问题你都会在我这里找到一种似曾相识的感觉,

    AndroidDemo:Android演示

    Android Demo, 学习过程中的一些笔记 chapter3 ~ chapter13 为 「Android 群英传」的 Demo ,做了部分修改并在上面增加了一些注释及评论用于备忘 art_Chapter[chapterNumber] 为 「Android 开发艺术探索」的 Demo ,...

    基于Bmob平台实现的记事本

    这是一个基于Bmob平台实现的记事本源码,代码中比较详细的注释解释了如何借助Bmob平台强大的后台处理功能实现Android客户端与后台服务器的数据交换。同时案例里面的侧滑菜单、自定义Adapter, ListView, Handler, ...

    Android开发笔记之:消息循环与Looper的详解

    Understanding LooperLooper是用于给一个线程添加一个消息队列(MessageQueue),并且循环等待,当有消息时会唤起线程来处理消息的一个工具,直到线程结束为止。通常情况下不会用到Looper,因为对于Activity,Service...

    Android中异步类AsyncTask用法总结

    本文总结分析了Android中异步类AsyncTask用法。分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独享,一并发在这里与大家共勉...

Global site tag (gtag.js) - Google Analytics