天天看点

Android中文API(126) —— Message

结构

继承关系

public final class Message extends Object implements Parcelabl

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 和 arg2是setData()的低成本替代品。

public int arg2

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调用。如果没有设置回调,此消息会分发到接收handler的handleMessage(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, arg2和obj的值。

         参数

                   h                设置的target值

                   what         设置的what值

                   arg1          设置的arg1值

                   arg2          设置的arg2值

                   obj             设置的obj值

         返回值

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

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

与obtain()一样,但是设置了target, what和obj的值。

                   what        设置的what值

public static Message obtain (Handler h, int what)

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

                   h                target的值

                   what         what的值

public static Message obtain (Handler h)

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

                   h                消息对象的target成员的值

public static Message obtain (Handler h, Runnable callback)

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

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

public static Message obtain ()

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

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

与obtain()一样,但是设置了target, what, arg1和arg2的值

                   h                设置的targe值

public static Message obtain (Message obj)

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

                   orig           要拷贝的源消息

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对象。如果可以,使用arg1和arg2域发送一些整型值以减少消耗。

参考

         getData()

         peekData() 

public void setTarget (Handler target)

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

public String toString ()

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

                   返回值

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

public void writeToParcel (Parcel dest, int flags)

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

参数

                            dest   对象被写入的Parcel

补充

文章精选

<a href="http://qaohao.iteye.com/blog/509145">Android中Message机制的灵活应用</a>

<a href="http://www.android123.com.cn/androidkaifa/422.html">Thread和Looper以及Handler和Message详解</a>

继续阅读