Android——线程通讯 Handler、Looper、Message;

线程通讯问题

(主要用到了Handler类,Looper类和Message类以及MessageQueue

Android主线程如何向子线程中发送消息的问题。让我们来想想,这其中的过程,无非就是创建一个Handler对象,然后一个线程发消息,另一个接收消息嘛。下面是接下来需要涉及到的几个重要类。我们可以把它们想象成以下几个内容。 信息队列管家(Looper); 消息队列(MessageQueue); 消息(Message):可以多个; 信息工人(Handler):可以多个;

下面主要介绍下这几个类:

1.LooperLooper它就像一个消息队列(MessageQueue)的管家(Looper),一个消息队列只有一个信息管家,并且管理整个消息队列,而一个消息队列内可以容纳多个消息(Message),而信息处理者(Handler)也可以有多个,消息队列处理者派遣他们向消息队列中存储或取出消息后执行任务;是用来为一个线程开启一个消息队列,通常情况下,Android下新开启的线程没有开启消息队列的(除了主线程外),主线程系统会默认为其开启一个消息队列;looper是通过MessageQueue来存放消息队列的,一个线程只有一个looper对象。

2.Message 是定义一个Messge包含必要的描述和属性数据,并且此对象可以被发送给android.os.Handler处理。属性字段:arg1arg2whatobjreplyTo等;其中arg1arg2是用来存放整型数据的;what是用来保存消息标识的;objObject类型的任意对象;replyTo是消息管理器,会关联到一个handlerhandler就是处理其中的消息。通常对Message对象不是直接new出来的,只要调用handler中的obtainMessage方法来直接获得Message对象。

3.Handler,通过handlerlooper来实现交互,通过可以把handler看做是looper的一个接口,用来向指定的looper发送消息和处理消息。Handler主要有两个用途:首先是可以定时处理或者分发消息,其次是可以添加一个执行的行为在其它线程中执行,对于Handler中的方法,可以选择你关心的操作去覆盖它,处理具体的业务操作,常见的就是对消息的处理可以覆盖public void handleMessage(参数)方法,可以根据参数选择对此消息是否需要做出处理。

注意:默认情况下,handler会与线程内定义的Looper绑定在非主线程中定义Handler=new Hander()会报错,原因是非主线程中默认没有创建Looper对象,需要先调用Looper.prepare()启用Looper  还有就是写在Looper.loop()之后的代码不会被执行,这个函数内部应该是一个循环,当调用mHandler.getLooper().quit()后,looper才会中止,其后的代码才能得以运行。 

Message机制原理示意图:

ActivityIntentReceiver   <------>  Handler<----->  Looper<----->  MessageQueue    

 

下面是一个实例来实现主线程内发送消息到线程类内:

 

  1. package com.example.xx;  

  2.   

  3. import android.os.Bundle;  

  4. import android.os.Looper;  

  5. import android.os.Message;  

  6. import android.app.Activity;   

  7. import android.view.View;  

  8. import android.view.View.OnClickListener;  

  9. import android.widget.Button;    

  10. public class MainActivity extends Activity {  

  11.    Private static final int MAKE = 0x1;

  12.      Private Button button;

  13.     @Override  

  14.     protected void onCreate(Bundle savedInstanceState) {  

  15.         super.onCreate(savedInstanceState);  

  16.     ...  //这里是简单的获取组件

  17.         final LooperThread looperThread = new LooperThread();  

  18.         looperThread.start();  

  19.         button.setOnClickListener(new OnClickListener() {  

  20.   

  21.             @Override  

  22.             public void onClick(View v) {  

  23.                 // TODO Auto-generated method stub  

  24.                String info=”这是内容";

  25.                 Message msMessage = new Message();  

  26.                 msMessage.what=MAKE;  

  27.                msMessage.obj =info;

  28.                 looperThread.handler.sendMessage(msMessage);  

  29.             }  

  30.         });  

  31.     }  

  32. }  


    下面是线程类,用来接收主线程内发送过来的消息

    1. package com.example.xx; 

    2. import android.os.Handler;  

    3. import android.os.Looper;  

    4. import android.os.Message;  

    5. import android.util.Log;  

    6.   

    7. public class LooperThread extends Thread {  

    8.     public static Handler handler;  

    9.   

    10.     @Override  

    11.     public void run() {  

    12.         // TODO Auto-generated method stub  

    13.         super.run();  

    14.         Looper.prepare();  

    15.         handler = new Handler() {  

    16.   

    17.             @Override  

    18.             public void handleMessage(Message msg) {  

    19.                 // TODO Auto-generated method stub  

    20.                If( Msg.what == MAKE){

    21.                      System.out.println("--" + msg.obj.toString()); 

    22.                   }  

    23.             }  

    24.         };  

    25.         Looper.loop(); 

    26.     }  

    27. }  

       

转载于:https://www.cnblogs.com/llw1996/p/6743794.html

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

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

相关文章

Abp 实现通过手机号注册用户

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 前言 Abp 的 Identity 模块&#xff0c;实现了用户的管理&#xff0c;但是对于国…

Exchange 2010 创建设备室邮箱

其实创建设备邮箱和创建会议室邮箱都差不多&#xff0c;只是在新建邮箱的时候&#xff0c;邮箱的类型选择的不一样&#xff1b;1、打开Exchange管理控制台&#xff0c;展开“收件人配置”选择“邮箱”节点&#xff1b;在中间空白的地方右击选择“新建邮箱”&#xff1b;或者在操…

简单的Excel导出(两种方式)

最近项目里面有个周报Excel导出的功能&#xff0c;为了解决这个问题&#xff0c;我显示调研Excel内核的方式实现了&#xff0c;但是被告知该方法有诸多弊端&#xff08;1、服务器需要装相应版本的Excel&#xff1b;2、如果程序中途出错服务器会有很多Excel进程&#xff09;&…

一款开源的文件搜索神器,终于不用记 find 命令了

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 这是 HelloGitHub 推出的《讲解开源项目》系列&#xff0c;用一篇文章带你快速上…

C2审核模式(c2 audit mode)

C2审核模式&#xff08;c2 audit mode&#xff09;SQL Server C2 Audit 是为了满足美国国防部针对计算机的安全访问的安全评级要求而引入的。 SQL C2Audit 可以记录shutdown,restart,成功和失败的Login,成功或者失败访问数据库对象&#xff0c;所欲数据定义的执行&#xff0c;数…

开发者必读:2022年移动应用趋势洞察白皮书

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 华为开发者联盟与艾瑞咨询联合发布《2022年移动应用趋势洞察白皮书》&#xff0c;本…

Java 阶段面试 知识点合集 - 我们到底能走多远系列(15)

我们到底能走多远系列&#xff08;15&#xff09; 扯淡&#xff1a;这些知识点来源是通过面试涉及到的&#xff0c;面的公司不多&#xff0c;知识点涉及也不多&#xff0c;我每次面试后都在备忘录里写下有用的东西&#xff0c;集合起来分享一下&#xff0c;因为是知识点&#x…

对比学习 ——simsiam 代码解析。

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 ​ 目录 1 &#xff1a; 事先准备 。 2 &#xff1a; 代码阅读。 2.1: 数据读取…

wiki常用语法

为什么80%的码农都做不了架构师&#xff1f;>>> 说明 输入 效果 作用在任何地方 斜体字 斜体字 斜体字 粗体字 粗体字 粗体字 粗体加斜体 粗体加斜体 粗体加斜体 下划线 &#xff08;推荐替代斜体&#xff09; <u>下划线</…

【ASP.NET Web API教程】3.3 通过WPF应用程序调用Web API(C#)

注&#xff1a;本文是【ASP.NET Web API系列教程】的一部分&#xff0c;如果您是第一次看本博客文章&#xff0c;请先看前面的内容。 3.3 Calling a Web API From a WPF Application (C#) 3.3 通过WPF应用程序调用Web API(C#) 本文引自&#xff1a;http://www.asp.net/web-api/…

java开发过程中的命名规范

为什么80%的码农都做不了架构师&#xff1f;>>> 最近在读项目的过程中&#xff0c;发现好多同事的代码并不是很规范&#xff0c;有的包名也按照了驼峰的写法&#xff0c;虽说这样不是不行&#xff0c;但个人认为开发过程中应该遵守这些规范&#xff0c;现整理规范如…

git 使用方法自用(勿进)本地开发分支推上线上开发分支

一、//查看状态 1.git status 二、//查看改了哪个文件夹 1.git diff 2.//会出现改了哪个文件夹src/components/partials/Slider.js 三、//查看改了的文件夹里面具体改了啥内容 1.git diff src/components/partials/Slider.js 四、提交所有 1. git add . 五、写备注…

SVG 和 CSS3 实现一个超酷爱心 Like 按钮

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 在现代网页中&#xff0c;我们经常可以在一些文章、视频和图片页面上找到”Like”按…

redis简单学习3-redis常用命令总结

2019独角兽企业重金招聘Python工程师标准>>> 1.键值相关的命令 keys 返回满足给定pattern的所有key 表达式* 代表取出所有的key redis 127.0.0.1:6379> keys * 1) "myzset2" 2) "myzset3" 3) "mylist" 4) "myset2" 5)…

微软的创新还是败笔?Windows 8为苹果创造天赐良机

网络安全公司Avast近日公布的数据显示&#xff1a;Windows系统使用人数正在不断下降。这一结果对微软来说可谓噩梦&#xff0c;于此同时&#xff0c;苹果则不断加强市场占有率。又是什么导致了这样的结果&#xff1f;接下来就看看最主要的几点&#xff1a; 调查覆盖了13.5万Wi…

testbench常用任务之SPI slave输出数据

模仿了SPI master从SPI slave读取数据的MiSO数据状态 每8个clk后读取的数据加1 用的一些额外寄存器需要自己声明和初始化 //------------------------------------------------------------------------- //send serial data which is increase by 1 on MiSO line //----------…

Vue生产环境调试的方法

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 vue 生产环境默认是无法启用vue devtools的&#xff0c;如果生产应用出了问题&…

RavenDB:基于Windows/.NET平台的NoSQL数据库

众所周知&#xff0c;NoSQL运动旨在成为大数据时代传统关系数据库管理系统的替代品。如今Microsoft对开源的态度有所转变&#xff0c;RavenDB就是很好的例子。Microsoft对RavenDB&#xff08;NoSQL数据库&#xff09;的认可令很多人感到惊讶。RavenDB可以轻易的替代关系数据库管…

JDBC实例--JDBC连接池技术解密,连接池对我们不再陌生

一、为什么我们要用连接池技术&#xff1f; 前面的数据库连接的建立及关闭资源的方法有些缺陷。统舱传统数据库访问方式&#xff1a;一次数据库访问对应一个物理连接,每次操作数据库都要打开、关闭该物理连接, 系统性能严重受损。 解决方案&#xff1a;数据库连接池&#xff08…

重温51汇编指令(附实验)

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 重温51汇编指令&#xff08;附实验&#xff09; 写在前面&#xff1a; 在电子控制…