android handler、looper、message、messageQueue、

一:handler,looper,message,messagequeue,thread

handler: 消息处理着,负责Message消息的发送(handler.sendMessage(....))以及处理消息,对于handler处理消息则需要实现handlerMessage(Message msg)该方法,通过该方法处理特定的消息,例如ui的更细

looper:消息泵,用来从messageQueue中抽取消息,所以一个looper对应一个messageQueue;

message:消息,message中含有该消息的ID以及消息处理对象或者处理的数据,通过messageQueue消息队列同一处理。

messageQueue,消息队列,messageQueue中保存 通过handler发送来的消息,当然该保存不是真正意义上保存,而是以链式结构将消息链接起来。等待looper的抽取

thread:线程,负的调度整个消息循环,即消息循环的场所执行

 

二:handler、looper、messageQueue之间的关系

      looper与messageQueue是一一对应的关系,及创建一个looper的同时创建一个messageQueue,handler与它们只是简单的聚合关系,handler中会引用当前线程中的looper与messageQueue,从这里可以看出对个handler 能够同时处理一个looper与messageQueue,前提是这些handler都在同一个线程中

 

三:简单实例:

     消息的生成:

  Message msg=Handler.obtiainMessage();

  msg.what=what;

  msg.sendToTarget();

   消息发送:    

  

   
  MessageQueue queue=looper.myQueue();

//通过该对象找到与之对应的消息队列messageQueue

if(queue!=null){
  msg.target=this  

     sent = queue.enqueueMessage(msg, uptimeMillis);

}

注:在handler的sendMessageAtTme(Message msg,long time)中可以看出handler 找到自己线程中的MessageQueue中的message 然后将message的target设置为handler自己,目的是message能够找到正确的handler

 

 三:抽取

 //得到handler所在线程中的looper对象;
   Looper looper=handler1.getLooper();

//通过该对象找到与之对应的消息队列messageQueue
  MessageQueue queue=looper.myQueue();

   while (true) {

            Message msg = queue.next();   //不断的从消息队列中获取消息 

            if (msg != null) {

                if (msg.target == null) {

                    return;

                }

                msg.target.dispatchMessage(msg);

                msg.recycle();

            }

        }

从这里我们可以看出 不断的从消息队列中获取消息,然后通过message的target中携带的信息去,寻找正确的handler  用来处理该消息

四:处理:

 

  handler = new Handler(){

     复写handlerMessage(Message msg);

     }  

至此,我们看到,一个Message经由Handler的发送,MessageQueue的入队,Looper的抽取,又再一次地回到Handler的怀抱。而绕的这一圈,也正好帮助我们将同步操作变成了异步操作。

 

 小实例:跟新UI

首先在主线程中如果我们使用handler不创建looper对象,则系统会默认使用主线程中已经创建好的looper对象,然而在非ui线程中我们使用handler而不传入looper对象,则这个handler不能接受消息。

通常的做法是:

  Thread thread = new Thread() {

   @Override
   public void run() {

//创建handler之前我们需要首先准备一个looper


    Looper.prepare();
    Handler handler = new Handler() {

     @Override
     public void handleMessage(Message msg) {
      // TODO Auto-generated method stub
      super.handleMessage(msg);
     }

    };
    super.run();
   }

  };

//将该looper启动(跑起来)这样就能够从messageQueue中抽取message   这样handler才能正常运行
  Looper.loop();
  thread.start();

 }

 

注:handler 处理消息总是在创建该handler的线程中运行,而我们的消息处理中,不乏更新UI的操作,不正确的线程直接更新UI将引发异常,因此我们需要实时注意handler所在的线程。

 

小结:

  • handler 的处理运行是在创建该handler的线程中运行
  • 一个looper对应一个messageQueue
  • 一个线程对应一个looper
  • 一个looper可以对应多个handler(这些handler在同一个线程中) 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

     

转载于:https://www.cnblogs.com/liuluchao/p/4044665.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

h5 android数字键盘,【笔记】移动端H5数字键盘input type=number的处理(IOS和Android)...

在Vue中的项目,基于VUX-UI开发,一个常见的需求:1、金额输入框2、弹出数字键盘3、仅支持输入两位小数,限制最大11位数,不允许0开头第一,首先想到额就是在VUX-UI中制定typenumber。--不可行VUX中的文档和代码…

Sybase数据库应用系统调优的五大领域

Sybase数据库应用系统调优的五大领域 2011/3/14/13:49来源:慧聪it网本 文以“某大型商业银行的网上银行系统”这一很具有典型意义的企业级大型Sybase数据库应用系统为例,涉及了数据库应用系统调优的五大领域:压力测试、 应用端调优、服务器端…

JQGrid 参数、属性API

JQGrid是一个在jquery基础上做的一个表格控件,以ajax的方式和服务器端通信。 JQGrid Demo 是一个在线的演示项目。在这里,可以知道jqgrid可以做什么事情。下面是转自其他人blog的一个学习资料,与其说是学习资料,说成查询帮助文档更…

android 6.0 ios9谁快,没安卓6.0流畅?iOS 9突飞猛进终于不卡

今天早些时候,iOS 9.1正式发布,改进系统Bug,添加新功能等,但还有不少反应系统流畅了。不知道是否是心里作用的关系,之前不少果粉吐槽iOS 9过于卡顿,苹果也是在一个版本一个版本的改进,这次的iOS…

(UML两个汇总)九种图。

最后总结UML关系,有明确的关系,现在让我们总结一下UML九图。。图往往比文字要直观,因此,当我们开发软件。文件必须是不可或缺的人物,。以下我将这九种图分了一下: 我们还能够将这九种图分为静态图和动态图&…

AutoMapper搬运工之自定义类型转换

前言 最近还挺忙,还有点累,一直都没更新了,实在是懒呀。正题之前先说点别的,最近公司要扩张了,需要大量开发,领导说推荐有钱可以拿,如此好机会,我就趁机做个广告。ShippingRen.com招…

XML基础

XML的英文全称是Extensible Markup Language,中文翻译为可扩展标记语言。它是网络应用开发的一项新技术。 与HTML一样,XML也是一种标记语言,但是XML的数据描述能力比HTML强,XML具有描述所有已知和未知数据的能力。XML扩展性比较好…

html使标签为正方形,W3C CSS测试答案

您的回答:1.CSS 指的是?您的回答:Cascading Style Sheets2.在以下的 HTML 中,哪个是正确引用外部样式表的方法?您的回答:3.在 HTML 文档中,引用外部样式表的正确位置是?您的回答&…

SqlBulkCopy 批量复制数据到数据表

使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据 使用Datatable作为数据源的方式:下面的代码使用到了Co…

OC-封装、继承、多态

面向对象的三大特征:封装、继承、多态 1.封装 什么是封装:在程序上,隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将对象得到的数据和行为(或功能&#xff0…

Android Ac 控件,Android控件--MultiAutoCompleteTextView

1.功能可支持选择多个值(在多次输入的情况下),分别用分隔符分开,并且在每个选中的时候再次输入值时会自动匹配,可用在发短信、发邮件时选择联系人这种类型当中。2.独特属性android:completionThreshold"3" ----设置输入多少字符时自…

BZOJ1299 [LLH邀请赛]巧克力棒

怎么又是博弈论。。。我去 Orz hzwer,这道题其实是可以转化成Nim游戏的! "第一步: 先从n根巧克力棒中取出m(m>0)根,使得这m根巧克力棒的xor和为0,同时使得剩下的n-m根巧克力棒无论怎么取,xor和都不…

android 安装应用程序apk安装不了

今天用测试机的时候遇到这个问题 解决办法: 在设置里面找到应用程序管理安全设置,,【允许未知来源程序安装】 -------------大致以上思路,具体按钮名称我就不重新去找了------------------

华为鸿蒙消费者,王成录谈鸿蒙挑战和华为消费者业务崛起

据 IDC 数据,全球智能手机出货量已连续 4 年下滑,在移动互联网之后,IoT 被认为是下一个更大量级的机会。在此背景下,鸿蒙是华为力图在 IoT 时代继续领先的关键项目,而面对贸易封锁,鸿蒙也成了华为冲出重围的…

读小米的《参与感》书的摘录(一),与大家分享!

1、互联网思维就是口碑为王 其实在过去选择产品,我们也一直会通过朋友或专家的口碑推荐来做决策,但不是主流。而今天口碑为王的背后,我理解我们面临的信息传播发生了一下三个重要的转变:1、信息从不对称转变为对称;2、…

Fragment的保存

2019独角兽企业重金招聘Python工程师标准>>> 一、场景 在一个fragment播放语音文件,一旦设备发生旋转,播放将暂停。因为fragment将重新生成。具体的流程步骤如下: 二、解决的方式 在Fragment的onCreate方法中,设置s…

html+监听+页面滚动到底部,解决HTML5中滚动到底部的事件问题

问题:在H5中,我们有这样的需求:例如有列表的时候,滚动到底部时,需要加载更多。解决方案:可以采用window的滚动事件进行处理分析:如果滚动是针对整个屏幕而言的(不针对于某个界面小块)&#xff0…

SQL Server 存储引擎-剖析Forwarded Records

我们都知道数据在存储引擎中是以页的形式组织的,但数据页在不同的组织形式中其中对应的数据行存储是不尽相同的,这里通过实例为大家介绍下堆表的中特有的一种情形Forwared Records及处理方式. 概念 堆表中,当对其中的记录进行更新时,如果当前数据页无法满足更新行的容量,此时这…

买面包和IoC

今天上午准备去一个阿姨,在那里买面包。这可能是由于小尺寸她的,因此,管理不规范,所以,当你买面包。没有人行。即使所有的大学生,似几乎没有这种意识。。。 但让我感到震惊的是。尽管没有排队,但…

u3d游戏开发视频潭州_游戏美术行业的发展与应用人工智能学院专业介绍及未来前景系列报告会二...

为了让2020级新同学对动漫专业加深认识,更好的规划学习,学院于11月12日6点晚邀请了校企合作单位“369云遮月游戏公司”在长安校区图书馆阶梯教室进行了游戏美术行业的发展与应用的报告会,主题围绕“专业介绍与发展前景”展开,云遮…