• Handler消息传递机制


    Android系统从4.0版本开始,就不允许在主线程(即UI线程)中进行访问网络、大数据计算等耗时操作了。为解决这个问题,我们需要借助Handler消息机制来实现了。

    Handler类的主要作用有两个:

    1、  在新启动的线程中发送消息

    2、  在主线程中获取、处理消息

    整个过程涉及到一个问题:新启动的线程何时发送消息?主线程何时获取并处理消息?

    为了让主线程“适时”处理子线程发送的消息,只能通过回调的方式-------重写Handler类中处理消息的方法,当新启动的线程发送消息时,消息会发送到与之关联的MessageQueue,而Handler会不断的从MessageQueue中获取并处理消息--------这样导致Handler中消息处理的方法被回调。

    Handler类常用的发送、处理消息的方法:

    void handleMessage(Message msg):   处理消息的方法。通常被重写

    final boolean hasMessage(int what):  检查消息队列中是否包含what属性为指定值的消息

    final boolean hasMessage(int what,Object obj): 检查消息队列中是否包含what属性及obj属性为指定对象的消息

    多个重载的Messge  obtainMesssage(): 获取消息

    sendEmptyMessage(int what): 发送空消息

    final boolean sendEmptyMessageDelayed(int what,long delayMillis):指定时间(单位为毫秒)后发送空消息

    final boolean sendMessage(Message msg): 立即发送消息

    final boolean sendMessageDelayed(Message msg,long delayMillis):指定时间(单位为毫秒)后发送消息

    Handler、Loop、MessageQueue的工作原理

    各组件功能描述如下:

    Message:Handler 接受和处理的消息对象

    Looper: 每个线程只能拥有一个Looper。它的loop方法负责读取MessageQueue中的消息,读到消息后就将消息交给发送该消息的Handler进行处理

    MessageQueue:消息队列,采用先进先出的方式管理Message。程序创建Looper对象时会在他的构造器中创建MessageQueue对象

    Handler:发送和处理消息。程序使用Handler发送消息,被Handler发送的消息必须被送到指定的MessageQueue。MessageQueue是由Looper负责管理。在主线程中,系统默认初始化一个Looper对象,因此直接创建Handler用于发送消息、处理消息即可;在子线程中必须通过Looper.preapre方法自己创建一个Looper对象用于子线程的MessageQueue维护。

    各组件的作用:

    Looper:每个线程只有一个Looper,负责管理MessageQueue,会不断从MessageQueue中取消息,并将消息分给对应的Handler处理

    MessageQueue:由Looper负责管理。采用先进先出的方式管理Message。

    Handler:把消息发送给Looper管理的MessageQueue,并负责处理Looper分给它的消息。

    使用步骤:

    1、  调用Looper的prepare方法创建Looper对象及MessageQueue

    2、  有了Looper后创建Handler子类的实例,重写handlerMessage()方法负责处理被Looper分到的消息

    3、  调用Looper的loop方法启动Looper

    参考《疯狂Android讲义  第2版》

  • 相关阅读:
    C# 监测每个方法的执行次数和占用时间(测试1)
    C# 依赖注入那些事儿
    SQL Server GROUP BY 后 拼接 字符串
    C# 根据Excel生成树
    C# 反射赋值
    C# 集合转换为DataTable
    Oracle 未能加载文件或程序集Oracle.DataAccess
    MySQL 各种主流 SQLServer 迁移到 MySQL 工具对比
    平衡树
    数据结构优化dp
  • 原文地址:https://www.cnblogs.com/PeijueerOrJacking/p/4422511.html
Copyright © 2020-2023  润新知