作家
登录

Android线程间通信之handler

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

 

根据handler发送消息的类型,分成2种情况:

  • handler发送了一个message到message queue
  • handler发送了一个runnbale到message queue

如不雅handler是发送了一个message到message queue,那么竽暌怪细分为2种情况

  • handler创建时设置了callback, 即handler = new Handler(callback);
  • handler创建时未设置callback,即handler = new Handler();

如不雅未设置callback,message会直接传给handler.handleMessage处理。

根据前面提到的,message.callback其实就是对runnable的封装,所以,如不雅handler是发送了一个runnable到message queue,那么就会履行这个runnable。

例子

如不雅设置了callback,那么message会先被callback处理。

如不雅callback返回true,解释处理完成,不会再传给handler.handleMessage了。

如不雅callback返回false,解释处理未完成,会再把message传给handler.handleMessage持续处理。

message

消息若何产生

message可以由构造函数生成。更多的时刻,是大年夜可收受接收的消息对象池琅绫擎直接获取的,供给机能。大年夜消息对象池获取一个消息的方法是Message.obtain(),也可以用Handler.obtainMessage()。

别的,不产生消息,也可以发送消息。好绕口,啥意思?handler.sendEmptyMessage(),可以发送一个空消息到message queue,不须要结垢荷琐message对象。

消息什么时刻发送

消息的处理机会照样由handler来决定(感到handler管的好宽==)。

handler.sendMessage,把message放到message queue的尾部列队,looper早年往后一个一个撤消息。handler.sendMessageAtFrontOfQueue,把message放到message queue的头晨,消息可以立时被处理。

handler.sendMessageAtTime,不立时发送消息到message queue,而是在指定的时光点发送。

handler.sendMessageDelayed,不立时发送消息到message queue,而是在指定的时延后再发送。

Looper

创建looper

创建looper的办法

  1. Loop.prepare(); 

经由过程looper.loop(),looper会赓续大年夜message queue撤消息,并派发出去。

若何产生消息

一路看看loop办法

  1. public static void loop() { 
  2.     ... 
  3.     for (;;) { 
  4.         Message msg = queue.next(); // might block 
  5.         if (msg == null) { 
  6.             // No message indicates that the message queue is quitting. 
  7.             return
  8.         } 
  9.         ... 
  10.         msg.target.dispatchMessage(msg); 
  11.         ... 
  12.     } 
  13.  

每个msg都有一个target属性,这个target就是发送消息的handler,派发message,就是派发给msg.target对象。

loop办法并不是无穷轮回的,一旦message queue为空,就会停止,以免经久占用cpu资本。

下图中,线程A是一个handler thread。如今线程B想让线程A处理一个消息message 5。于是,线程B拿到线程A的handler引用,然后调用handler的sendMessage。

message 5被发送到线程A的message queue。

looper怎么知道message应当派发给哪一个handler呢?

线程A怎么去处理这个消息呢?应用looper.loop办法,每次会大年夜message queue掏出一条消息,当取到message 5,解释message 5即将被处理。

真正的消息处理逻辑,是在handler的handleMessage琅绫擎自定义的(或者runnable,callback,这里以handleMessage为例)。


  推荐阅读

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

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


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

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

关键词: 探索发现

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

网友点评
自媒体专栏

评论

热度

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