Parcelable接口的describeContents()的目的

Sur*_*esh 69 android

可能重复:
Parcelable where/when是describeContents()使用的?

实现Parcelable接口的describeContents()函数的目的是什么?大多数框架代码返回0作为实现.文档说"一个位掩码,指示由Parcelable编组的特殊对象类型集." 有人可以解释这个功能.(可能有一个例子)

Bar*_*ica 10

可能会发生您的类将具有子类,因此在这种情况下,每个子类都可以返回describeContent()不同的值,因此您将知道要从哪个特定对象类型创建Parcel.例如像这里 - Parcelable在父类(MyParent)中实现方法的示例:

//************************************************
// Parcelable methods
//************************************************
//need to be overwritten in child classes 
//MyChild_1 - return 1 and MyChild_2 - return 2
public int describeContents() {return 0;}

public void writeToParcel(Parcel out, int flags)
{
    out.writeInt(this.describeContents());
    out.writeSerializable(this);
}

public Parcelable.Creator<MyParent> CREATOR
        = new Parcelable.Creator<MyParent>()
{
    public MyParent createFromParcel(Parcel in)
    {
        int description=in.readInt();
        Serializable s=in.readSerializable();
        switch(description)
        {
            case 1:
                return (MyChild_1 )s;
            case 2:
                return (MyChild_2 )s;
            default:
                return (MyParent )s;
        }
    }

    public MyParent[] newArray(int size)
    {
        return new MyParent[size];
    }
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,不需要Parcelable在子类中实现所有方法 - 除外describeContent()

  • 正确答案:[Parcelable在哪里/何时使用describeContents()?](http://stackoverflow.com/questions/4076946/parcelable-where-when-is-describecontents-used/4914799#4914799) (21认同)
  • 这个答案是不正确的.`Serializable`方法也可以在不使用describeContents()的情况下工作.您可以使用该值将反序列化对象强制转换为MyParent或其子类之一.但createFromParcel()的返回类型是MyParent,因此您可以在所有情况下简单地转换为MyParent,忽略描述值. (8认同)