handler发送消息到message queue,所以,结垢荷琐handler的时刻必须知道message queue,才能肯定把消息发送到哪里。
而message queue是由looper来治理的,是以次序上,必须先创建了looper,才能创建handler。
创建线程的Looper,
- Looper.prepare();
所以,创建一个handler的┞俘确写法是:
- new Thread(new Runnable(){
- public void run() {
- Looper.prepare();
- Handler handler = new Handler();
- }
- }).start();
派发消息
可能有同窗会认为奇怪,日常平凡用new Handler() 的时刻没有先调用Looper.prepare()也一样可以悠揭捉??那是因为,handler是在主线程创建的。
- // ActivityThread.java
- public static void main(String[] args) {
- ...
- Looper.prepareMainLooper();
- ...
- }
runnable的封装
可能大年夜家会认为奇怪,message queue应当装的是message,那么handler.post(runnable),runnable跑哪里去了呢?
发送机会
runnable其实也是发送给了message queue,只不过在发送前,先对runnable进行了封装。
- public final boolean post(Runnable r){
- return sendMessageDelayed(getPostMessage(r), 0);
- }
- private static Message getPostMessage(Runnable r) {
- Message m = Message.obtain();
- m.callback = r;
- return m;
- }
用getPostMessage 把runnable包装成一个message,message的callback就是runnable。是以,分辨一个message是不是runnable,其实只要看message的callback是否为空,如不雅为空,就是通俗的message,不然,就是一个runnbale。
若何处理消息
看下dispathMessage
- public void dispatchMessage(Message msg) {
- if (msg.callback != null) {
- handleCallback(msg); // handler.post(runnable)时走这里
- } else {
- if (mCallback != null) { // handler = new Handler(callback)时走这里
- if (mCallback.handleMessage(msg)) {
- return;
- }
- }
- handleMessage(msg); // handler = new Handler()时走这里
- }
- }
推荐阅读
作为最大年夜名鼎鼎的收集多媒体技巧之一,Flash的名号可谓是无人不知无人不晓。然而,触手曾伸及形形色色网站的Flash,如今终于椅氯狯汗青的舞台。Adobe已经宣布,Flash将会在2020年停止开辟和更新,这意味着Flash已>>>详细阅读
本文标题:Android线程间通信之handler
地址:http://www.17bianji.com/lsqh/36581.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示