Handler机制整理
目录介绍
1.关于handler消息机制图
2.关于handler基本介绍
3.使用handler的几种方法
4.关于handler底层源码解读

1.关于Handler消息机制图

2.关于Handler机制基本解读
Message
消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。

sendMessage(message);                                    //发送消息
sendEmptyMessage(0);                                     //其实内部实现还是和上面一样
endEmptyMessageAtTime(int what, long uptimeMillis);      //定时发送空消息
sendEmptyMessageDelayed(int what, long delayMillis);     //延时发送空消息
sendMessageAtTime(Message msg, long uptimeMillis);       //定时发送消息
sendMessageDelayed(Message msg, long delayMillis);       //延时发送消息
sendMessageAtFrontOfQueue(Message msg);                  //最先处理消息(慎用)

Handler
处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。

MessageQueue
消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。
把消息进行排序,排序的依据就是消息要执行的时间

Looper
消息泵,不断地从MessageQueue中抽取Message执行。通过Looper去消息队列取消息
当主线程创建的时候,就会创建一个looper,looper在new的时候会创建一个MessageQueue 。所以,一个线程对应一个Looper一个Looper对应一个MessageQueue
Looper创建之后必须调用loop方法,loop方法中有一个死循环,这个死循环会不断去消息队列里取消息,取出消息之后就会调用handler的handlemessage方法处理消息

Thread
线程,负责调度整个消息循环,即消息循环的执行场所。

3.使用handler的几种方法
1.1主线程中定义Handler,子线程中发消息,通知Handler完成UI更新
Handler对象必须定义在主线程中,如果是多个类直接互相调用,就不是很方便,需要传递content对象或通过接口调用

在主线程中

主线程接收消息处理操作
private Handler myHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch(msg.what) {case 0://更新UI等break;case 1://更新UI等break;default:break;}}
};
//开启一个子线程,子线程发送信息
new Thread(new Runnable() {@Overridepublic void run() {//处理耗时逻辑if(a==1){               //直接发送信息,消息标识中并没有带参数/***获取消息,尽量用obtainMessage()方法,查看源码发现,该方法节省内存。*不提倡用Messenger msg=new Messenger()这种方法,每次创建一个对象,肯定不节省内存啦!*至于为什么该方法还存在,估计还是有存在的必要吧。(留作以后深入研究)*/Message message = myHandler.obtainMessage();message.what = 1;                               //消息标识myHandler.sendMessage(message);                 //发送消息}else if(a==2){Message msg = myHandler.obtainMessage();msg.what = 1;                                   //消息标识msg.arg1=2; //存放整形数据,如果携带数据简单,优先使用arg1和arg2,比Bundle节省内存。msg.arg2=3;                                     //存放整形数据Bundle bundle=new Bundle();bundle.putString("dd","abcd");bundle.putInt("love",5);msg.setData(bundle);msg.obj=bundle;                                 //用来存放Object类型的任意对象myHandler.sendMessage(msg);                     //发送消息}else if(a==3){Message obtain = Message.obtain();obtain.what = 1;myHandler.sendMessage(obtain);}else if(a==4){myHandler.sendEmptyMessage(0);                  //其实内部实现还是和上面一样}}}
).start();

2.1用Activity对象的runOnUiThread方法更新

new Thread() { public void run() { //这儿是耗时操作,完成之后更新UI; runOnUiThread(new Runnable(){ @Override public void run() { //更新UI } }); }
}.start();
如果在非上下文类中(Activity),可以通过传递上下文实现调用;
Activity activity = (Activity) imageView.getContext();
activity.runOnUiThread(new Runnable() { @Override public void run() { //更新UI imageView.setImageBitmap(bitmap); } 

4.关于handler底层源码解读

Handler机制整理相关推荐

  1. android中handler机制,如何使用?,Android中的Handler机制

    一.Handler概述 二.Handler发送消息的方法 三.MessageQueue的enqueueMessage() 四.Message的when字段 五.子线程中使用Handler 六.Loop ...

  2. android Handler机制之ThreadLocal详解

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

  3. Android多线程:深入分析 Handler机制源码(二)

    前言 在Android开发的多线程应用场景中,Handler机制十分常用 接下来,深入分析 Handler机制的源码,希望加深理解 目录 1. Handler 机制简介 定义 一套 Android 消 ...

  4. Android开发--多线程中的Handler机制/Looper的介绍

    在多线程的开发中,Handler机制如同在主线程中运行一样,只是需要注意在非主线程中Handler机制的作用限制,本文将对这些内容作出解释. * 如果应用上一个例子的方法对UI界面进行操作,将抛出异常 ...

  5. 深入浅出,Handler机制外科手术式的剖析(ThreadLocal,Looper,MessageQueen,Message)(上)...

    2019独角兽企业重金招聘Python工程师标准>>> 为什么会有handler机制? 在Android中,所有的UI控件都是运行在主线程中的, 如果我们从子线程访问UI,系统会报异 ...

  6. 【Android 异步操作】Handler 机制 ( Handler 常用用法 | HandlerThread 简介 | HandlerThread 源码注释分析 )

    文章目录 一.Handler 常用用法 二.HandlerThread 简介 三.HandlerThread 源码 一.Handler 常用用法 主线程 Handler 主要作用 : Looper 和 ...

  7. 【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )

    文章目录 I . Handler 机制简介 II . Handler 机制 Handler Message Looper MessageQueue 四组件对应关系 III . Handler ( 消息 ...

  8. Android 为什么要有handler机制?handler机制的原理

    为什么要有handler机制? 在Android的UI开发中,我们经常会使用Handler来控制主UI程序的界面变化.有关Handler的作用,我们总结为:与其他线程协同工作,接收其他线程的消息并通过 ...

  9. 浅谈Android中的Handler机制

    Handler是Android中提供的一种异步回调机制,也可以理解为线程间的消息机制.为了避免ANR,我们通常会把一些耗时操作(比如:网络请求.I/O操作.复杂计算等)放到子线程中去执行,而当子线程需 ...

  10. 浅谈Handler机制

    Android中Handler是一个十分重要的东西,很多时候都需要用到Handler.那什么是Handler呢?又为什么要用Handler呢? 什么是Handler? 我们知道Android更新UI的 ...

最新文章

  1. 《Linux内核设计与实现》读书笔记(十四)- 块I/O层
  2. 在WIN7下硬盘安装XP双系统
  3. 爬山法实现 八皇后问题 (Python 实现)
  4. linux shell基础
  5. 软件技术论坛_新一代三维GIS软件技术论坛在南宁召开
  6. oracle awr报告生成_5.性能测试 - Oracle体系结构和性能优化简介
  7. Vue:vue过滤器的使用、借助第三方库moment.js实现时间过滤器
  8. 实验室计算机系统权限管理规程,计算机辅助建筑设计实验室使用规范(试行)...
  9. 西门子PLC编程软件step7 v5.5 和仿真软件S7-Plcsim安装与授权
  10. OpenCV Python 图像矩阵的均值和标准差
  11. python关系图谱_利用Python+Gephi构建LOL全英雄间的关联图谱
  12. 计算机病毒模块测试题,计算机病毒分类测试题集
  13. 记事本文件管理器关联文本类
  14. 超级账本Fabric2.x 如何将智能合约部署到通道
  15. mysql的url参数_mysql-url参数
  16. 基于PHP爬虫的微博热搜实时监控平台
  17. 专业的选择 人生的方向
  18. 如何查看win10系统的异常关机日志
  19. 计算机专业个人评定,计算机专业个人自我鉴定
  20. 高效解决触客难题的外呼系统,其实原理很简单!

热门文章

  1. 非线性动力学 matlab,非线性动力学matlab
  2. 计算机黑板报主题ps,Photoshop︱用PS创建一个黑板报
  3. ibm服务器远程管理口 口令,IBM X系列服务器|IMM2设置远程管理口|默认IP
  4. batchplot插件用法_batchplot批量打印怎么用?Batchplot(CAD批量打印工具)安装步骤
  5. Unity中更改鼠标光标样式
  6. ISO27001的认证周期及流程
  7. pes2019服务器中断,实况足球2019卡顿原因及解决办法分享
  8. 图片片转换成位深度为1的单色bmp照片
  9. 使用ExtendSim进行 化学工程、采矿作业和工艺流程仿真
  10. 无人驾驶相关文献阅读体会