内容简介:Android 的消息机制主要是指 Handler 的运行机制,Handler 的运行需要底层的 MessageQueue 和 Looper 来支持。MessageQueue 是一个消息的存储单元,Looper 以无限循环的形式去查找是否有新的消息,有的话就处理,没有就一直等待。Looper 中有一个特殊的概念 - ThreadLocal线程默认是没有 Looper 的,如果需要使用 Handler 就必须为线程创建 Looper。Android 主线程也叫 UI 线程,确切的说应该是 ActivityT
Android 的消息机制主要是指 Handler 的运行机制,Handler 的运行需要底层的 MessageQueue 和 Looper 来支持。
MessageQueue 是一个消息的存储单元,Looper 以无限循环的形式去查找是否有新的消息,有的话就处理,没有就一直等待。Looper 中有一个特殊的概念 - ThreadLocal
线程默认是没有 Looper 的,如果需要使用 Handler 就必须为线程创建 Looper。Android 主线程也叫 UI 线程,确切的说应该是 ActivityThread,其被创建时就会初始化 Looper,这就是主线程默认可以使用 Handler 的原因。
Android 的消息机制概述
- Android 系统不允许子线程更新 UI 是因为 UI 控件不是线程安全的。
- Handler 创建时会采用当前所在线程的 Looper 来构建内部消息循环系统,如果当前线程没有 Looper,则会报错。
- Handler 的 post 方法将一个 Runnable 投递到 Handler 内部的 Looper 中去处理,其实最终都是通过 send 方法来完成的。
- Handler 的 send 方法调用时,会调用 MessageQueue 的 enqueueMessage 方法将这个消息放入消息队列,然后 Looper 就发现有新消息,接着处理这个消息,最终消息中的 Runnable 或者 Handler 的 handleMessage 方法就会被调用,这样一来就实现了线程切换。
Android 的消息机制分析
ThreadLocal 的工作原理
- ThreadLocal 是一个线程内部的数据存储类,存储数据后,只有在指定线程才能获取数据,其他线程无法获取。
- 当某些数据是以线程为作用域并且不同线程具有不同的数据副本时可以使用 ThreadLocal。
- 不同线程中访问同一个 ThreadLocal 的 set 和 get 方法,它们对 ThreadLocal 所做的读写操作仅限于各自线程内部,这就是互不干扰的原因。
消息队列的工作原理
- 消息队列在 Android 中指的是 MessageQueue,MessageQueue 主要包含两个操作:插入(enqueueMessage)和读取(next)。
- next 读取消息的同时会将其从消息队列中删除。
- MessageQueue 的内部实现并不是队列,而是通过一个单链表的数据结构来维护消息列表。
- next 方法是一个无线循环的方法,没有消息时一直阻塞,当有新消息到来,next 会返回这条消息并将其从单链表中移除。
Looper 的工作原理
- Looper 不停地从 MessageQueue 中查看是否有新的消息,如果有就立即处理,否则就一致阻塞在那里。
-
为线程创建 Looper:
new Thread() { @Override public void run() { Looper.prepare(); // 创建 Looper Handler handler = new Handler(); Looper.loop(); // 开启消息循环 } }.start();
-
Looper.prepareMainLooper()
可以给主线程 ActivityThread 创建 Looper。 - 获取主线程 Looper 可以通过
Handler handler = new Handler(Looper.getMainLooper());
。 - Looper 提供了两个方法退出
quit
和quitSafely
,退出后 Handler 发送消息会失败。 - 如果手动为子线程创建了 Looper,那么所有事情完成后应该调用
quit
方法来终止消息循环,否则线程会一直处于等待状态。
Handler 的工作原理
- Handler 的工作主要包括消息的发送(
post
和send
)和接收过程。 -
Handler 发送消息的过程仅仅是向消息队列中插入了一条消息,MessageQueue 的
next
方法就会返回这条消息给 Looper,Looper 收到消息后就开始处理了,最终消息由 Looper 交由 Handler 处理,即 Handler 的dispatchMessage
的方法会被回调。public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
expert one-on-one J2EE Development without EJB 中文版
[美] Rod Johnson、Juergen Hoeller / JavaEye / 电子工业出版社 / 2005-9 / 59.80元
乍一看这本书的名字,Expert one on one J2EE development without EJB并没有给人带来太冲击。毕竟关于J2EE的书太多了,而without EJB看上去有点象是故意挑衅EJB的感觉。一本J2EE的书怎么可能会给人带来信念或思维的冲击呢?但是它做到了,它不仅使自己变成了不朽的经典,也使Rod Johnson成为了我最近一年的新偶像。 ......一起来看看 《expert one-on-one J2EE Development without EJB 中文版》 这本书的介绍吧!