Handler

Android中 ui的更新需要在主线程中进行,一些耗时的操作我们会放在后台线程中进行,而将执行结果在ui线程中进行。 安卓在设计时就封装了一套消息创建,传递,处理机制,如果不遵循这样的机制,就无法更新ui信息,并抛出异常: 不能在非UI线程中去更新UI。 因此就引入了hanlder机制

特点
a. 允许你去发送并处理一条runnable对象和messageQueue相关联的信息。
b. 每一个handler的实例都与一个单独的线程
c. 当创建一个新的处理程序时,它将绑定到正在创建线程的线程/消息队列, 从那个点开始,它将向该消息队列传递信息和runnables,并在它们从消息队列中释放和执行它们。

运行机制

Handler机制也可以叫做异步机制, 它由四个部分组成分别是: Message. Handler, MessageQueue, Looper

1. Message
Message是在线程中传递的消息,它可以在内部携带少量的消息, 用于在不同线程中交换数据, Message的arg1, arg2可以储存int数据, obj可以携带object数据。

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

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

4.Looper
Looper用于管理每个线程中的MessageQueue, 调用Looper的loop()方法后,就会进入一个无限的循环。 每当MessageQueue储存一条信息,Looper就会将这条信息取出, 由Looper按先入先出顺序取出,再根据Message对象的what属性分发给对应的Handler的HandleMessage()方法中。 每个线程只有一个Looper.

Handler怎么用

Handler可以分发Message和 Runnable对象进入主线程中, 每个Handler实例都会绑定到创建它的线程中 它由两个作用:
1.合理调度安排消息和Runnable对象,使他们在将来的某个点执行。
2. 安排一个动作在不同线程执行。

Handler中一些常见的方法:
post(Runnable)直接开启Runnable线程
postAtTime(Runnable,long)在指定的时间long,开始启动线程
postDelayed(Runnable long)在延迟long时间后,启动Runnable线程
sendEmptyMessage(int) 发送指定的消息,通过参数int来区分不同的消息
sendMessage(Message)发送消息到UI线程中
sendMessageAtTime(Message,long) 这个long代表的是系统时间,不推荐用
sendMessageDelayed(Message,long) 此方法long代表调用后几秒后执行。
sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.

handler基本使用:
1)在主线程中,使用handler很简单,new一个Handler对象实现其handleMessage方法,在 handleMessage 中提供收到消息后相应的处理方法即可。(接收消息,并且更新UI)

  1. 在新启动的线程发送消息。
public class HandlerActivity extends AppCompatActivity {private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);tv.setText("msg.arg1:"+msg.arg1+"--msg.arg2:"+msg.arg2);}};private TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_handler);initView();new Thread(new Runnable() {@Overridepublic void run() {Message msg = Message.obatin();//实例化消息对象msg.arg1 = 99;//携带参数msg.arg2 = 100;//携带参数Object str = new Object();//实例化对象msg.obj = str; //携带参数为实体类对象handler.sendMessage(msg);}});}private void initView() {tv = (TextView) findViewById(R.id.tv);}
}

总结:
首先在UI线程我们创建了一个Handler实例对象,无论是匿名内部类还是自定义类生成的Handler实例对象,我们都需要对handleMessage方法进行重写,在此方法中我们可以通过参数来接受msg来写接受消息后如何处理。 接着我们创建一个子线程,在子线程中需要更新ui时,新建一个Message对象,并且将消息的数据记录在这个消息对象Message的内部,比如arg1,arg2,obj等, 在通过前面创建的handler的sendMessage方法把次消息给发送出去, 此时这个Message会放入MessageQueue中等待被处理, 此时MessageQueue的管家Looper会不停的把messageQueue存在的消息取出来,通过回调dispatchMessage方法将消息传递给Handler的handleMessage方法,最终前面提到的消息会被Looper从MessageQueue中取出来传递给handleMessage方法,最终得到处理。

安卓handler机制相关推荐

  1. 【安卓Handler】Handler消息机制

    [安卓通信机制]Handler 由于以后以后要从事安卓系统方面的工作,然而本人半个月前还是Android小白. 这几天学习了gityuan的Android操作系统架构, 按照自己喜欢的方式总结一下. ...

  2. 安卓 Handler 消息机制(总)

    注:本文参考于某公开课,如有侵权,请联系本人,会立即删除 注:仅用作自我学习记录,未有任何商业用途. 关于handler的由来 开始前的闲言碎语 我们都知道handler是安卓的消息传递机制,使用ha ...

  3. 安卓 Handler 消息机制之Message源码

    一 概述 1. Message是handler机制中消息传递的载体,主要用来规范化传输数据的格式. 2. 源码内容含几个部分: 2.1 操作数据相关:一些属性和操作属性的getter和setter方法 ...

  4. 安卓 Handler 消息机制之MessageQueue源码

    首先,MessageQueue是属于底层类且它依附于创建他的Looper,除Looper外其他类无法单独创建他,如果要使用他,只能从Looper出获得. 下面将从几方面分析: 1. 消息队列存储原理 ...

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

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

  6. 自己写个C++版本Handler来理解Android的Handler机制

    由于日常工作不需要经常写android上层应用,对Android的Handler机制一直处于模模糊糊的状态.使用Handler之后,回去写c++代码时,时刻怀念Android里面的Handler,希望 ...

  7. android Handler机制之ThreadLocal详解

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

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

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

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

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

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

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

最新文章

  1. red hat关于桥接模式连不上外网或者没有IP
  2. 六个深度学习常用损失函数总览:基本形式、原理、特点
  3. android view自定义
  4. 【AI有识境】如何掌握好图像分割算法?值得你看的技术综述
  5. PHP stripos strpos,strpos()和stripos()函数的区别
  6. 3.10 十进制转换为二进制
  7. python里面的import provide_Python importorror:没有名为wmi的模块
  8. ORA-08103: object no longer exists
  9. 一个多月的时间,终于把这件事做完了!
  10. 教你用手机代替各类门禁卡
  11. C语言判断上三角矩阵
  12. Python数据分析基础之CSV文件(5)
  13. c语言中怎样写入百分号,C语言中如何用printf函式输出百分号?
  14. 网站提示HTTP503Service Unavailable的处理办法
  15. Js中${}字符串拼接
  16. Lenovo 拯救者15ISK硬件升级
  17. 服务器阵列有什么作用,服务器存储-存储服务器和磁盘阵列有什么区别
  18. 易安卓读取HTML,易安卓(E4A)怎么保存设置?
  19. 2021较全 腾讯云服务器安装宝塔面板建网站全过程(图文教程)
  20. 2017年成都初中计算机考试时间,成都市教育局关于2017-2018学年全日制中小学教学时间安排的通知...

热门文章

  1. 2022年计算机二级Access数据库程序设计复习题及答案
  2. 浅谈一下workstation
  3. vmware workstation网络设置
  4. 微型计算机原理与接口技术综述论文,微型计算机原理接口与技术综述论文汇编.doc...
  5. html提醒用户IE浏览器版本过低,引导更新或下载其他浏览器
  6. python贪心算法
  7. ASP.Net中控件的EnableViewState属性
  8. 函数调用中的堆栈平衡
  9. 批处理FOR命令详解
  10. 在线抽签html,抽签网页板代码