• Android Message 及其使用


    一、线程间通讯的Message机制

    1、Message介绍

    frameworksasecorejavaandroidOsMessage.java

    Message是线程之间传递信息的载体,包含了对消息的描述和任意的数据对象。Message中包含了两个额外的 int字段和一个object字段,这样在大部分情况下,使用者就不需要再做内存分配工作了。虽然Message的构造函数是public的,但是最好是使用Message.obtain( )或Handler.obtainMessage( )函数来获取Message对象,因为Message的实现中包含了回收再利用的机制,可以提供效率。

    2、MessageQueue介绍

    frameworksasecorejavaandroidOsMessageQueue.java

    MessageQueue用来容纳Message队列的,其中的Message是由Looper来分发的,Message不能直接添加到MessageQueue中,而是要通过与Looper关联的Handler去添加。

    3、Looper

    frameworksasecorejavaandroidOsLooper.java

    Looper是线程用来运行消息循环的。线程本身是没有消息循环的,需要在线程中调用perpare函数,然后调用loop去处理消息。在Android中,系统在启动主线程的时候会自动为之建立一个Looper。

    建立本线程的Looper:

    public static final void prepare()

    运行本线程的Looper:

    public static final void loop()

    获取本线程的Looper:

    public static final Looper myLooper()

    获取主线程的Looper:

    public synchronized static final Looper getMainLooper()

    4、Handler

    frameworksasecorejavaandroidOsHandler.java

    Handler是用来发送和处理与线程相关联的Message和Runnable对象的。每个Handler都与一个单独的线程以及线程消息队列相关联的。当你创建Handler时,Handler就与线程以及线程消息队列绑定了,从那以后,Handler就可以将 Message和Runnable发送给对应的消息队列,并且能够处理从消息队列中出来的消息。

    Handler提供了用户需要调用的大部分接口

    A、创建Handler:

    创建与本地线程相关联的Handler:

    1 public Handler()
    2  
    3 public Handler(Callback callback)

    创建与指定线程相关联的Handler:

    1 public Handler(Looper looper)
    2  
    3 public Handler(Looper looper, Callback callback)

    B、创建消息

    1 public final Message obtainMessage()
    2  
    3 public final Message obtainMessage(int what)
    4  
    5 public final Message obtainMessage(int what, Object obj)
    6  
    7 public final Message obtainMessage(int what, int arg1, int arg2)
    8  
    9 public final Message obtainMessage(int what, int arg1, int arg2, Object obj)

    C、删除消息

    删除在消息队列中未处理的消息

    1 public final void removeMessages(int what)
    2  
    3 public final void removeMessages(int what, Object object)

    D、发送消息

    1 public final boolean sendMessage(Message msg)
    2  
    3 public final boolean sendMessageDelayed(Message msg, long delayMillis)
    4  
    5 public final boolean post(Runnable r)
    6  
    7 public final boolean postDelayed(Runnable r, long delayMillis)

    E、处理消息

    在Looper的loop函数中循环取出MessageQueue的接收消息队列中的消息,然后调用Hander的dispatchMessage函数对消息进行处理,至于如何处理(相应消息)则由用户指定(三个方法,优先级从高到低:Message里面的Callback,一个实现了Runnable接口的对象,其中run函数做处理工作;Handler里面的mCallback指向的一个实现了Callback接口的对象,里面的handleMessage进行处理;处理消息 Handler对象对应的类继承并实现了其中handleMessage函数,通过这个实现的handleMessage函数处理消息)。

    01 public void dispatchMessage(Message msg) {
    02  
    03 if (msg.callback != null) {
    04  
    05        handleCallback(msg);
    06  
    07     else {
    08        if (mCallback != null) {
    09          if (mCallback.handleMessage(msg)) {
    10             return;
    11          }
    12        }
    13  
    14        handleMessage(msg);
    15 }
    16 }

    二、Message机制的用途

    Message机制有两种用途:

    定时执行:延迟到指定时间执行消息调度

    线程通讯:将某些操作在其他线程中排队执行

    1、定时执行

    通过本线程的Handler将消息延迟到指定时间执行,相当于定时器的作用

    1 public final boolean sendMessageDelayed(Message msg, long delayMillis)
    2  
    3 public final boolean postDelayed(Runnable r, long delayMillis)

    还可以在指定时间到期之前,通过removeMessages取消执行

    2、线程通讯

    Android的UI是单线程的,Android希望UI线程能够给予User快速的反应,如果UI线程花费太多的时间做幕后的事情,吵过5秒钟,Android就会给出错误提示。因此为了避免拖住UI,一下较费时的工作应该交给独立的线程去执行。但是如果幕后的线程来执行UI对象,Android又会发出错误信息,所以UI线程与幕后线程需要进行通讯。UI线程将工作分发给幕后线程,幕后线程执行后将相应的状态返回给UI线程,让UI线程对UI做成相应的更新。

  • 相关阅读:
    mysql-master-ha 实现mysql master的高可用。
    一个不错的工具版本管理工具
    java的日志知识
    从解决一个java.lang.NoSuchMethodError想到的
    一个单点登录问题的解决
    关于2013年1月21日的DNS故障分析文章
    每日好的资源整理
    mongodb3.4 sharding安装文档
    python 函数
    codis3安装测试
  • 原文地址:https://www.cnblogs.com/huanjianlin/p/3210306.html
Copyright © 2020-2023  润新知