最近两天在学习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对象时,才可进行消息的接收

更多相关文章

  1. android主线程中Looper.loop()为什么不会造成程序ANR
  2. android字体闪烁动画(线程)
  3. android——ListView功能的实现
  4. Android使用NDK进行联网签名认证
  5. Android(安卓)开发之 定时器 Handler + Runnable方式
  6. 如何进行Android单元测试
  7. ListView中使用线程实现无限加载
  8. android利用handler回到主线程
  9. Android实现发短信@彩信功能

随机推荐

  1. Android(安卓)JNI char* 和jstring类型相
  2. Android6.0 Fix launcher3 crash when se
  3. Android一键锁屏开发全过程【源码+附图】
  4. Android中上传图片到服务端C#接收图
  5. Android(安卓)翻牌动画 实现
  6. Android中判断网络是否连接实例详解
  7. Android实现画虚线的控件
  8. Mac无法编译android
  9. Android(安卓)之 网络访问服务器,解析JSON
  10. SmallActivity创建