zoukankan      html  css  js  c++  java
  • 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版》

  • 相关阅读:
    汇总:unity中弹道计算和击中移动目标计算方法
    Unity3D游戏开发之SQLite让数据库开发更简单
    3DMAX可编辑多边形常用命令-桥
    3dmax沿立方体边扩展出面
    3dmax切割平行线
    Litjson
    使用 Unity 3D 开发游戏的架构设计难点
    Unity T4M 中文讲解
    unity5.5打包
    颜色模式
  • 原文地址:https://www.cnblogs.com/PeijueerOrJacking/p/4422511.html
Copyright © 2011-2022 走看看