1.什么是Handler?

  Handler是可以通过发送和处理Message和Runnable对象来关联相应线程的MessageQueue。通常我们认为它是一种异步机制。

  a.可以让对应的Message和Runnable在未来的某个时间点进行相应的处理。

  b.让自己想要的耗时操作在子线程中完成,让更新UI的操作在主线程中完成,而子线程与主线程之间的通信就是靠Handler来完成。

2.Handler内部的实现机制

  面试的时候,Handler的原理问到的概率还是蛮大的,不光只是为了面试,我们好好去了解一下Handler的原理,那么对于我们去使用Handler而言是非常有好处的,至少我们知道我们发送的消息如何发送到了UI线程的,当出现问题时,我们只要小小一分析便会知道问题发生于何处,然后解决它,好了,闲话不多扯了,下面来介绍Handler机制的实现原理。
  Handler机制也可叫异步消息机制,它主要由4个部分组成:Message,Handler,MessageQueue,Looper,在上面我们已经接触到了Message和Handler,接下来我们对4个成员进行着重的了解:

1.Message
  Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。使用Message的arg1和arg2便可携带int数据,使用obj便可携带Object类型数据。

2.Handler
  Handler顾名思义就是处理者的意思,它只要用于在子线程发送消息对象Message,在UI线程处理消息对象Message,在子线程调用sendMessage方法发送消息对象Message,而发送的消息经过一系列地辗转之后最终会被传递到Handler的handleMessage方法中,最终在handleMessage方法中消息对象Message被处理。

3.MessageQueue
  MessageQueue就是消息队列的意思,它只要用于存放所有通过Handler发送过来的消息。这部分消息会一直存放于消息队列当中,等待被处理。每个线程中只会有一个MessageQueue对象,请牢记这句话。其实从字面上就可以看出,MessageQueue底层数据结构是队列,而且这个队列只存放Message对象。

4.Looper
  Looper是每个线程中的MessageQueue的管家,调用Looper的loop()方法后,就会进入到一个无限循环当中,然后每当MesssageQueue中存在一条消息,Looper就会将这条消息取出,并将它传递到Handler的handleMessage()方法中。每个线程只有一个Looper对象。

  了解了上述Handler机制的4个成员后,我们再来把思路理一遍:首先在UI线程我们创建了一个Handler实例对象,无论是匿名内部类还是自定义类生成的Handler实例对象,我们都需要对handleMessage方法进行重写,在handleMessage方法中我们可以通过参数msg来写接受消息过后UIi线程的逻辑处理,接着我们创建子线程,在子线程中需要更新UI的时候,新建一个Message对象,并且将消息的数据记录在这个消息对象Message的内部,比如arg1,arg2,obj等,然后通过前面的Handler实例对象调用sendMessge方法把这个Message实例对象发送出去,之后这个消息会被存放于MessageQueue中等待被处理,此时MessageQueue的管家Looper正在不停的把MessageQueue存在的消息取出来,通过回调dispatchMessage方法将消息传递给Handler的handleMessage方法,最终前面提到的消息会被Looper从MessageQueue中取出来传递给handleMessage方法,最终得到处理。这就是Handler机制整个的工作流程

3.如何使用Handler让子线程与子线程之间进行通信?

  如今的面试,Handler基本上很多面试者都会流畅的说出来,但是如果想要给面试官亮点,那就需要我们对Handler了解的十分透彻,我们通常代码中是子线程与主线程进行异步通信,那么子线程与子线程之间也可以吗?当然可以,只不过我们需要对Looper足够了解,深入研究Hanlder你可以看笔者Handler源码分析部分。那么我们如果需要子线程A和子线程B之间进行Handler通信,而且是子线程A向子线程B发送消息,那么我们应该怎样做呢?

public class MainActivity extends AppCompatActivity {private Handler threadHandler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}class ThreadA extends Thread{@Overridepublic void run() {super.run();Looper.prepare();threadHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);//收到来自于ThreadB的消息,注意这里运行在ThreadA线程中//......}};Looper.loop();}}class ThreadB extends Thread{@Overridepublic void run() {super.run();Looper looper = Looper.myLooper();Message message = new Message();message.obj = "ThreadB发送消息到ThreadA";//......threadHandler.sendMessage(message);}}}
  • 笔者写的这份代码也许不好,但是没有关系,我们只需要学会其中几个关键的地方,如何让ThreadB往ThreadA中发送消息,首先你得在ThreadA中准备一个Looper,也就是消息轮询大管家,然后准备发送消息的Handler,准备发送消息的Handler很容易理解,那就是在ThreadA中生成一个Handler对象即可,那么准备Looper怎么做呢?在ThreadA中调用Looper.prepare(),然后再调用Looper.loop()即可

关于handler更多:https://blog.csdn.net/qq_30107007/article/details/88662219

Android Handler机制相关推荐

  1. Android Handler机制简单分析

    丨版权说明 : <Android Handler机制简单分析>于当前CSDN博客和乘月网属同一原创,转载请说明出处,谢谢. 本文一切从简,将围绕以下流程展开叙述: what why how ...

  2. Android Handler机制分析

    转自:http://blog.csdn.net/stonecao/article/details/6417364 在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长 ...

  3. Android Handler机制(一) 为什么设计Handler

    一. 前言 做安卓开发也有好几年了, 一直在用Hanlder, 都是为了做项目功能实现就完了,核心原理研究的不深,平时有什么问题都是看下博客也能够解决,积累的都是零散的,过段时间忘了又得重新去翻, A ...

  4. Android Handler机制 - handleMessage究竟在哪个线程执行

    关于Handler的原理,看了很多博客,个人认为以下三篇文章讲的不错,第一篇篇幅最短,虽然没有源码讲解,但结合流程图概括的很精炼:第二篇稍长,是CSDN博客专家--鸿洋写的,结合源码分析,简单易懂:最 ...

  5. android Handler机制原理解析(一篇就够,包你形象而深刻)

    首先,我将Handler相关的原理机制形象的描述为以下情景: Handler:快递员(属于某个快递公司的职员) Message:包裹(可以放置很多东西的箱子) MessageQueue:快递分拣中心( ...

  6. android Handler机制之ThreadLocal详解

    概述 我们在谈Handler机制的时候,其实也就是谈Handler.Message.Looper.MessageQueue之间的关系,对于其工作原理我们不做详解(Handler机制详解). Messa ...

  7. android模拟多任务键,模拟Android Handler机制——单线程处理多任务

    消息类(Message): package p; public class Message { private Runnable runnable; private long start; priva ...

  8. Android Handler机制笔记

    1.初始化MainLooper,保存在静态变量ThreadLocal里面 ActivityThread.java Looper.prepareMainLooper();prepare();sThrea ...

  9. [Android]Handler的消息机制

    最经面试中,技术面试中有一个是Handler的消息机制,细细想想,我经常用到的Handler无非是在主线程(或者说Activity)新建一个Handler对象,另外一个Thread是异步加载数据,同时 ...

最新文章

  1. liunx 在虚拟机(VMware)下挂载光驱命令
  2. objc_msgSend() 使用报错解决方案
  3. OpenCV学习笔记之改变图像的对比度和亮度
  4. 在linux下安装python3_【转】在Linux下安装python3
  5. Hadoop分布式文件系统HDFS
  6. d3d9 抓取windows屏幕
  7. 20 万台 QQ 服务器全面上云!
  8. hdu 4313 Matrix 并查集 多校联合赛(二) 第四题
  9. jdbc连接数据库代码
  10. ACM:竞赛技巧(c++)
  11. ZYNQ下载程序出现错误Memory write error at 0x100000. APB
  12. pythonurllib新浪微博_定向爬虫 - Python模拟新浪微博登录(示例代码)
  13. 已有Microsoft365许可证,但是office无法激活
  14. 关于Anaconda(Miniconda)虚拟环境中的包的问题pkgs
  15. uni-app checkbox和switch组件checked属性无效的解决方案
  16. Matlab中interp2和interpn的差异
  17. python学习 字典
  18. jQuery(一)jQuery的认识和使用
  19. linux常用命令(61):ps命令
  20. 2022最新彩虹易支付系统二开版本源码/新增推广返利模式+工单系统

热门文章

  1. [vue] 组件中写name选项有什么作用?
  2. 前端学习(2675):vue3.0学习建议
  3. 前端学习(2587):权限控制的分类和意义
  4. 前端学习(2354):image组件的基本使用
  5. 前端学习(2020)vue之电商管理系统电商系统之完成商品添加操作
  6. 第五十二期:Java开发数据库设计的14个技巧,你知道几个?
  7. java学习(151):字节输出流
  8. 实例32:python
  9. 实战|手把手教你训练一个基于Keras的多标签图像分类器
  10. [资源]基于 Pytorch 的 TorchGAN开源了!