设计Handler类的目的

Handler类被用来注册到一个线程中,这样可以提供一个简单的通信渠道,用来发送数据到这个线程。

可作为UI线程与后台线程交互的几种方法之一。

具体用途

  1. 消息的分发和处理,安排 messages 和 runnables在未来某个时刻被执行;
  2. 队列action在其他线程上被执行;

与之相关的类:looper类,

looper 主要功能是为特定单一线程运行一个消息环。

  1. 一个线程对应一个looper。同样一个looper对应一个线程。这就是所谓的特定单一;

  2. 一般情况下,在一个线程创建时他本身是不会产生他特定单一的looper的(主线程是个例外)。因此我们需要手动的把一个looper与线程相关联。其方法只需在需要关联的looper的线程中调用Looper.prepare。之后我们再调用Looper.loop启动looper。

    如下例子:

     class NetWorkThread implements Runnable
    {
    public MyHandler mHandler =new MyHandler();
    @Override
    public void run() { Looper.prepare();
    //mHandler =new MyHandler();
    Looper.loop();
    }
    }
  3. 具体的说,在我们将特定单一looper与线程关联的时候,looper会同时生产一个messageQueue。他是一个消息队列,looper会不停的从messageQuee中取出消息,也就是message。然后线程就会根据message中的内容进行相应的操作。

  4. looper和handler并非一一对应的。一个looper可以对应多个handler,而一个handler只能对应一个looper。handler和looper的绑定,是在构建handler的时候实现的,具体查询handler的构造函数。

  5. message,虽然我们可以自己创建一个新的message,但是更加推荐的是调用handler的obtainMessage方法来获取一个message。这个方法的作用是从系统的消息池中取出一个message,这样就可以避免message创建和销毁带来的资源浪费了。

假设A线程要传递信息给B线程,我们需要做的就是

  1. 在B线程中调用Looper.prepare和Looper.loop。(主线程不需要)
  2. 编写Handler类,重写其中的handleMessage方法。
  3. 创建Handler类的实例,并绑定looper
  4. 调用handler的sentMessage方法发送消息。

实例代码

NetWorkThread mNetWorkThread =new NetWorkThread();
new Thread(mNetWorkThread).start();
Message msg = mNetWorkThread.mHandler.obtainMessage();
msg.arg1=12;
mNetWorkThread.mHandler.sendMessage(msg);

Message相关

Message的使用样例

Message message = Message.obtain();
message.arg1 = 1;
message.arg2 = 2;
message.obj = "Demo";
message.what = 3;
Bundle bundleData = new Bundle();
bundleData.putString("Name", "Lucy");
message.setData(bundleData);

Message可以传递的参数有

  1. public int arg1 arg2 整数类型,是setData的低成本替代品。传递简单类型
  2. public Object object 类型
  3. public int what 用户自定义的消息代码,这样接受者可以了解这个消息的信息。每个handler各自包含自己的消息代码,所以不用担心自定义的消息跟其他handlers有冲突。
  4. 其他的可以通过Bundle进行传递

Message的构造函数

Message可以通过new Message构造来创建一个新的Message,但是这种方式很不好,不建议使用。最好使用Message.obtain()来获取Message实例,它从消息池获取。

参考链接

  1. Android开发中Handler的经典总结
  2. Android background processing with Handlers, AsyncTask and Loaders - Tutorial
  3. Android中UI线程与后台线程交互设计的5种方法
  4. Java中Runnable和Thread的区别
  5. Android:主线程如何向子线程发送消息
  6. android parcelable 详解

012android初级篇之Handler机制的更多相关文章

  1. 25个增强iOS应用程序性能的提示和技巧(初级篇)

    25个增强iOS应用程序性能的提示和技巧(初级篇) 标签: ios内存管理性能优化 2013-12-13 10:53 916人阅读 评论(0) 收藏 举报  分类: IPhone开发高级系列(34)  ...

  2. ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇(转)

    ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇   阅读目录 ASP.NET Identity 前世今生 建立 ASP.NET Identity 使用ASP.NET ...

  3. Handler机制原理图、源码、使用!!!!!

    android的消息处理机制——Looper,Handler,Message  (原理图.源码) 转自:http://my.oschina.net/u/1391648/blog/282892 在开始讨 ...

  4. Redis从入门到精通:初级篇

    原文链接:http://www.cnblogs.com/xrq730/p/8890896.html,转载请注明出处,谢谢 Redis从入门到精通:初级篇 平时陆陆续续看了不少Redis的文章了,工作中 ...

  5. Redis从入门到精通:初级篇(转)

    原文链接:http://www.cnblogs.com/xrq730/p/8890896.html,转载请注明出处,谢谢 Redis从入门到精通:初级篇 平时陆陆续续看了不少Redis的文章了,工作中 ...

  6. PHP初级篇

    PHP初级篇 PHP环境搭建: 企业中常用到的环境是:Linux+Apache+MySQL+PHP 学习环境是:Windows+Apache+MySQL+PHP 工具 Apache 2.4.4 MyS ...

  7. 源码篇:Handler那些事

    前言 Handler属于八股文中非常经典的一个考题了,导致这个知识点很多时候,考官都懒得问了:这玩意很久之前就看过,但是过了一段时间,就很容易忘记,但是处理内存泄漏,aidlHandler之类的考点答 ...

  8. .NET C#教程初级篇 1-1 基本数据类型及其存储方式

    .NET C# 教程初级篇 1-1 基本数据类型及其存储方式 全文目录 (博客园).NET Core Guide (Github).NET Core Guide 本节内容是对于C#基础类型的存储方式以 ...

  9. Python 正则表达式入门(初级篇)

    Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...

随机推荐

  1. 接入WebSocket记录 + 一些个人经验

    闲扯 WebSocket 以前没用过,之前写过一篇博客是基于原生socket的(查看)比较复杂,慎入.今天另外一个APP需要接websocket了,然后便找到了facebook的 SocketRock ...

  2. XDebug 教程

    安装说明: PHP调试时,不得不提XDEBUG这个调试利器.学习PHP以来,几乎所有的问题我都利用它来解决. 首先关于如何安装,不在赘述,请自行google之.(需要特别注意的是:PHP5.2 和5. ...

  3. [转载]深入理解java多态性

    FROM:http://blog.csdn.net/thinkGhoster/article/details/2307001 昨天看到一个关于多态性的帖子,参考了回帖者的理解,加入了一些自己的看法,整 ...

  4. Jenkins+Maven+Gitlab+Nexus持续集成环境搭建

      1.软件及服务介绍 Jenkins:jenkins是实现代码自动化流程上线的工具,Jenkins是一个独立的开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个 ...

  5. EffectiveJava(24)使用@SuppressWarnings("unchecked")消除非受检警告

    -..使用泛型编程时,会遇到许多编译器警告,如:非受检强制转化警告,非受检方法调用警告,非受检普通数组创建警告,费受精转换警告.这次的内容就是遇到这些警告的时候你该怎么办. PS:非受检警告就是代码上 ...

  6. POJ 3083:Children of the Candy Corn(DFS+BFS)

    Children of the Candy Corn Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9311 Accepted: ...

  7. UVA 11534 - Say Goodbye to Tic-Tac-Toe(博弈sg函数)

    UVA 11534 - Say Goodbye to Tic-Tac-Toe 题目链接 题意:给定一个序列,轮流放XO,要求不能有连续的XX或OO.最后一个放的人赢.问谁赢 思路:sg函数.每一段.. ...

  8. Qt笔记——元对象系统

    Qt元对象系统提供了对象间的通信机制:信号和槽.以及执行类形信息和动态属性系统的支持.是标注C++的一个扩展,它使得Qt可以更好的实现GUI图形用户界面编程.Qt的元对象系统不支持C++模板.虽然模板 ...

  9. Spring Cloud简单入门教程

    原文地址:http://www.cnblogs.com/skyblog/p/5127690.html 按照官方的话说:Spring Cloud 为开发者提供了在分布式系统(如配置管理.服务发现.断路器 ...

  10. 分别在.NET Framework 与 .NET Core 框架下 编写Windows Service(windows服务程序)

    前言,为什么会分别在两个框架下编写Windows Service,是因为最近在做区块链这块,使用的是NEO(小蚁区块链)的相关技术,NEO使用的是.net core 2.1,业务上需要写两个程序,一个 ...