• Android中文API(126) —— Message



    前言

      本章内容是android.os.Message,版本为Android 3.1 r1,翻译来自"strongxu",欢迎访问他的微薄"http://t.qq.com/strongxu",再次感谢"strongxu"!欢迎你一起参与Android的中文翻译,联系我over140@gmail.com。

    声明

      欢迎转载,但请保留文章原始出处:)

        博客园:http://www.cnblogs.com/

        Android中文翻译组:http://goo.gl/6vJQl

    Message

    译者署名: strongxu

    译者微博:http://t.qq.com/strongxu

    版本:Android 3.1 r1

     

    结构

    继承关系

    public final class Message extends Object implements Parcelable

            

    java.lang.Object

    android.os.Message

     

    类概述

    定义一个包含任意类型的描述数据对象,此对象可以发送给Handler。对象包含两个额外的int字段和一个额外的对象字段,这样可以使得在很多情况下不用做分配工作。

    尽管Message的构造器是公开的,但是获取Message对象的最好方法是调用Message.obtain()或者Handler.obtainMessage(), 这样是从一个可回收对象池中获取Message对象。

     

    字段

    public static final Creator<Message> CREATOR

     

     

    public int arg1

    如果只需要存储几个整型数据,arg1 arg2setData()的低成本替代品。

     

    public int arg2

    如果只需要存储几个整型数据,arg1 arg2setData()的低成本替代品。

     

    public Object obj

    发送给接收器的任意对象。当使用Message对象在线程间传递消息时,如果它包含一个Parcelable的结构类(不是由应用程序实现的类),此字段必须为非空(non-null)。其他的数据传输则使用setData(Bundle)方法。

    注意Parcelable对象是从FROYO版本以后才开始支持的。

     

    public Messenger replyTo

    指明此message发送到何处的可选Messenger对象。具体的使用方法由发送者和接受者决定。

     

    public int what

    用户自定义的消息代码,这样接受者可以了解这个消息的信息。每个handler各自包含自己的消息代码,所以不用担心自定义的消息跟其他handlers有冲突。

     

    公共构造器

      public      Message()       

      构造器(但是获取Message对象的最好方法是调用Message.obtain())。

     

    公共方法

    public void copyFrom (Message o)

    使此message跟参数o相似。浅拷贝数据域。不拷贝源message的链表字段,时间戳和目标/回调。

     

    public int describeContents ()

    描述了包含在Parcelable对象排列信息中的特殊对象的类型。

    返回值

             一个标志位,表明Parcelable对象特殊对象类型集合的排列。

     

    public Runnable getCallback ()

    获取回调对象,此对象会在message处理时执行。此对象必须实现Runnable接口。回调由接收此消息并分发的目标handler调用。如果没有设置回调,此消息会分发到接收handlerhandleMessage(Message)

     

    public Bundle getData ()

    获取附加在此事件上的任意数据的Bundle对象,需要时延迟创建。通过调用setData(Bundle)来设置Bundle的值。需要注意的是,如果通过Messenger对象在进程间传递数据时,需要调用Bundle类的Bundle.setClassLoader()方法来设置ClassLoader,这样当接收到消息时可以实例化Bundle里的对象。

             参考

                      peekData()

                      setData(Bundle)

     

    public Handler getTarget ()

    获取将接收此消息的Handler对象。此对象必须要实现Handler.handleMessage()方法。每个handler各自包含自己的消息代码,所以不用担心自定义的消息跟其他handlers有冲突。

     

    public long getWhen ()

    返回此消息的传输时间,以毫秒为单位。

     

    public static Message obtain (Handler h, int what, int arg1, int arg2, Object obj)

    obtain()一样,但是设置了target, what, arg1, arg2obj的值。

             参数

                       h                设置的target

                       what         设置的what

                       arg1          设置的arg1

                       arg2          设置的arg2

                       obj             设置的obj

             返回值

                       从全局池中分配的一个Message对象。

     

    public static Message obtain (Handler h, int what, Object obj)

    obtain()一样,但是设置了target, whatobj的值。

             参数

                       h                设置的target

                       what        设置的what

                       obj             设置的obj

             返回值

                       从全局池中分配的一个Message对象。

     

    public static Message obtain (Handler h, int what)

    obtain()一样,但是设置了targetwhat的值。

             参数

                       h                target的值

                       what         what的值

             返回值

                       从全局池中分配的一个Message对象。

     

    public static Message obtain (Handler h)

    obtain()一样,但是设置了target的值

             参数

                       h                消息对象的target成员的值

             返回值

                       从全局池中分配的一个Message对象。

     

    public static Message obtain (Handler h, Runnable callback)

    obtain(Handler)一样,但是设置回调函数,在Message返回时调用。

             参数

                       h                消息对象的target成员的值

                       callback    当消息处理时会调用的回调函数

             返回值

                       从全局池中分配的一个Message对象。

     

    public static Message obtain ()

    从全局池中返回一个新的Message实例。在大多数情况下这样可以避免分配新的对象。

     

    public static Message obtain (Handler h, int what, int arg1, int arg2)

    obtain()一样,但是设置了target, what, arg1arg2的值

             参数

                       h                设置的targe

                       what         设置的what

                       arg1          设置的arg1

                       arg2          设置的arg2

             返回值

                       从全局池中分配的一个Message对象。

     

    public static Message obtain (Message obj)

    obtain(),但是从一个已存在的消息中拷贝值(包括它的目标)。

             参数

                       orig           要拷贝的源消息

             返回值

                       从全局池中分配的一个Message对象。

     

    public Bundle peekData ()

    getData()相似,但是并不延迟创建Bundle。如果Bundle对象不存在返回null。更多信息见getData()

             参考

                       getData()

                       setData(Bundle)

     

    public void recyle ()

    向全局池中返回一个Message实例。一定不能在调用此函数后再使用Message——它会立即被释放。

     

    public void sendToTarget ()

    Handler发送此消息,getTarget()方法可以获取此Handler。如果这个字段没有设置会抛出个空指针异常。

     

    public void setData (Bundle data)

    设置一个任意数据值的Bundle对象。如果可以,使用arg1arg2域发送一些整型值以减少消耗。

    参考

             getData()

             peekData()

     

    public void setTarget (Handler target)

    设置将接收此消息的Handler对象。

     

    public String toString ()

    返回一个Message对象简单的,可读懂的描述信息。鼓励子类重写此方法,实现时最好把对象的类型的数据考虑进去。默认的实现等同与以下表达式:

         

    如果需要实现toString方法,参考Writing a useful toString method

                       返回值

                                一个代表此对象的可打印字符串

    public void writeToParcel (Parcel dest, int flags)

    将类的数据写入外部提供的Parcel

    参数

                                dest   对象被写入的Parcel

                                flags 对象如何被写入的附加标志,可能是0PARCELABLE_WRITE_RETURN_VALUE

                      

    补充

    文章精选

    AndroidMessage机制的灵活应用

    ThreadLooper以及HandlerMessage详解

     

     

     
  • 相关阅读:
    declare set声明注意
    Winform 的dadagridview控件的修改操作
    VS2010,VS2008,VS2005;工程之间的转换
    C#程序跨平台?
    上网黑色护眼,设置浏览器黑色风格
    AutoCompleteSource从文件里读取自动填充内容
    两个checkbox的控件控制操作只能选其一
    《博客园精华集CLR/C#分册》第三轮筛选结果 转载
    TransactSQL 示例 查询某个数据库内的所有表的记录行数及其总和
    EF 4.1中内部经常提交的 exec sp_reset_connection 的用途原来是为了重用池中的连接
  • 原文地址:https://www.cnblogs.com/over140/p/2088637.html
Copyright © 2020-2023  润新知