Android为什么需要Handler消息处理机制

Android的UI操作不是线程安全的,只有主线程才能够操作UI,同时主线程对于UI操作有一定的时间限制(最长5秒)ANR。为了能够做一些比较耗时的操作(比如下载、打开大文件等),android提供了一些列机制。
理解Handler之前需要理解的内容是ThreadLocal类

责任链模式定义

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些请求连成一条链,并沿着这条链传递请求,直到有对象处理它为止。

ThreadLocal的理解

1. 早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。2. 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。3. 使用Map的方式持有对象,ThreadLocalMap,key 是该线程本身,value 是该线程引用的值。

Handler的基本构成要素

http://www.cnblogs.com/angeldevil/p/3340644.html 该文章对Handler的实现源码进行了深入讲解。

以下是对Handler的实现的详细说明

* Looper 的作用。ThreadLocal 管理当前线程,并对Looper控制。Looper 对象中持有MessageQueue。    使用Looper的方法,有三个步骤:        第一步: Looper.prepare(); 初始化Looper        第二步:                //经常使用这个方法,目的也就是从ThreadLocal中获取的当前线程中的Looper                mLooper = Looper.myLooper();                 mHandler = new Handler(mLooper) 。                Handler持有该Looper。        第三步: Looper.loop();                 1. 从sThreadLocal中获取当前线程中的Looper                2. 从在从looper中获取MessageQueue                 3. 该方法的就是一个死循环,不断的从MessageQueue中获取Message。                4. 如果有新的消息,那么就回传给Handler处理。* Handler的处理    第一步:持有Looper。    第二步:sendMessage(Message ) ,该方法也就是直接把msg 添加到MessageQueue中去。            需要说明的是MessageQueue 也是从Looper中获取而来的。* NativeMessageQueue 也就是C++ 代码对MessageQueue进行了处理。

总结

在使用Handler处理线程间消息的时候,总是先使用Looper先进行得到当前线程。1. 在Activity UI线程中Looper 直接使用的是UI线程。2. 在子线程中使用,那么就必须获取当前Looper作为参数传入。3. 这样不管在子线程还是在当前线程使用handler发送消息,handler持有的Looper对象的ThreadLocal中获取MessageQueue进行    存储。4. Looper.loop(),总是对MessageQueue进行消息处理。

Handler&责任链模式

根据Handler的实现原理,完全是按照责任链模式进行设计和现实的。是一种消息的处理,Handler采用了Queue的方式处理
- Looper 把这些消息连接成一条链(是MessageQueue的管理者)
- Message 消息对象
- MessageQueue 连接成链的消息(消息队列数据结构)
- Handler 消息处理者(发送消息和处理消息)

更多相关文章

  1. EventBus :概述及基本概念 《一》
  2. EventBus 《四》 事件的优先级及其EventBus Demo
  3. Android(安卓)& iOS 开发全面对比分析
  4. Android(安卓)4.0 触摸屏消息(二大写的二)
  5. Android中的线程处理
  6. Android线程模型解析(包括UI的更新)
  7. Android中AsyncTask(异步任务)和Handler(线程消息机制)的详解
  8. Android,谁动了我的内存(1)
  9. android开发——通过子线程更新界面UI

随机推荐

  1. [转]Why Android isn’t ready for TDD,
  2. android adb 文章
  3. android获取sd卡路径方法
  4. AndEngine绘制滚动文本TickerText
  5. Android 中Fragment实现(芝麻虽小,必不可
  6. ANDROID获取Task及Process
  7. android之android.os.NetworkOnMainThrea
  8. opencv for android 教程(环境搭建篇)
  9. Android 保存图片到SQLite
  10. Android中自带的RSA加密算法和JAVA中的区