作家
登录

Android线程间通信之handler

作者: 来源: 2017-08-08 09:09:02 阅读 我要评论

  •     }  
  • handler发送消息到message queue,所以,结垢荷琐handler的时刻必须知道message queue,才能肯定把消息发送到哪里。

    而message queue是由looper来治理的,是以次序上,必须先创建了looper,才能创建handler。

    创建线程的Looper,

    1. Looper.prepare(); 

    所以,创建一个handler的┞俘确写法是:

    1. new Thread(new Runnable(){ 
    2.     public void run() { 
    3.         Looper.prepare(); 
    4.         Handler handler = new Handler(); 
    5.     } 
    6. }).start();  

    派发消息

    可能有同窗会认为奇怪,日常平凡用new Handler() 的时刻没有先调用Looper.prepare()也一样可以悠揭捉??那是因为,handler是在主线程创建的。

    1. // ActivityThread.java 
    2. public static void main(String[] args) { 
    3.     ... 
    4.     Looper.prepareMainLooper(); 
    5.     ... 
    6.  

    runnable的封装

    可能大年夜家会认为奇怪,message queue应当装的是message,那么handler.post(runnable),runnable跑哪里去了呢?

    发送机会

    runnable其实也是发送给了message queue,只不过在发送前,先对runnable进行了封装。

    1. public final boolean post(Runnable r){ 
    2.    return  sendMessageDelayed(getPostMessage(r), 0); 
    3.  
    4. private static Message getPostMessage(Runnable r) { 
    5.     Message m = Message.obtain(); 
    6.     m.callback = r; 
    7.     return m; 
    8.  

    用getPostMessage 把runnable包装成一个message,message的callback就是runnable。是以,分辨一个message是不是runnable,其实只要看message的callback是否为空,如不雅为空,就是通俗的message,不然,就是一个runnbale。

    若何处理消息

    看下dispathMessage

    1. public void dispatchMessage(Message msg) { 
    2.     if (msg.callback != null) { 
    3.          handleCallback(msg);    // handler.post(runnable)时走这里 
    4.      } else { 
    5.          if (mCallback != null) { // handler = new Handler(callback)时走这里 
    6.              if (mCallback.handleMessage(msg)) { 
    7.                  return
    8.              } 
    9.          } 
    10.          handleMessage(msg); // handler = new Handler()时走这里 
    11.      } 
    12.  } 

        推荐阅读

        Flash终于走向死亡!Flash的兴衰之路你知多少

      作为最大年夜名鼎鼎的收集多媒体技巧之一,Flash的名号可谓是无人不知无人不晓。然而,触手曾伸及形形色色网站的Flash,如今终于椅氯狯汗青的舞台。Adobe已经宣布,Flash将会在2020年停止开辟和更新,这意味着Flash已>>>详细阅读


      本文标题:Android线程间通信之handler

      地址:http://www.17bianji.com/lsqh/36581.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)