java - 在具有嵌套非原始元素的对象中实现 Parcelable

标签 java android parcelable

我有一个表单对象

public class Car implements Serializable, Parcelable {

    private static final long serialVersionUID = 1L;

    String name;
    String description;
    String brand;
    int speed;
    int brake;
    int asset;
    ArrayList<Uri> images;

    public Car(String name, String description, String brand, int speed,
            int brake, int asset, ArrayList<Uri> images) {
        super();
        this.name = name;
        this.description = description;
        this.brand = brand;
        this.speed = speed;
        this.brake = brake;
        this.asset = asset;
        this.images = images;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public int getBrake() {
        return brake;
    }

    public void setBrake(int brake) {
        this.brake = brake;
    }

    public int getAsset() {
        return asset;
    }

    public void setAsset(int asset) {
        this.asset = asset;
    }

    public ArrayList<Uri> getImages() {
        return images;
    }

    public void setImages(ArrayList<Uri> images) {
        this.images = images;
    }

    public static long getSerialversionuid() {
        return serialVersionUID;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + asset;
        result = prime * result + brake;
        result = prime * result + ((brand == null) ? 0 : brand.hashCode());
        result = prime * result
                + ((description == null) ? 0 : description.hashCode());
        result = prime * result + ((images == null) ? 0 : images.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + speed;
        return result;
    }

    @Override
    public String toString() {
        return "Car [name=" + name + ", description=" + description
                + ", brand=" + brand + ", speed=" + speed + ", brake=" + brake
                + ", asset=" + asset + ", images=" + images + "]";
    }

    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    public void writeToParcel(Parcel dest, int flags) {
        // TODO Auto-generated method stub

    }




}

但是我不明白如何实现

public void writeToParcel(Parcel dest, int flags) {
    // TODO Auto-generated method stub

}

public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
}

implements Parcelable 添加到类后 Eclipse 需要

在 Android 网站上,示例还展示了一种方法

  public static final Parcelable.Creator<MyParcelable> CREATOR
             = new Parcelable.Creator<MyParcelable>() {
         public MyParcelable createFromParcel(Parcel in) {
             return new MyParcelable(in);
         }

使我的整个类(以及作为 ArrayList 的所有嵌套对象)“可解析” 的正确方法是什么?

按照示例,我到达了构造函数

public Car(Parcel in) {
   name= in.readString();
 description= in.readString();
speed=in.readInt();
...

images=in.readArrayList(??????????????????);
}

传入readArrayList(..)的类加载器是什么?

最佳答案

关于writeToParcel你应该做的方法:

public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(brand); //To write String
}

论点destwriteToParcel method 有很多其他方法来编写其他对象或原始类型。 将其他没有特定方法的对象放在 dest 中对象,您应该使用方法 writeParcelable如果您尝试编写的对象实现 ParcelablewriteSerializable如果您尝试编写的对象实现 Serializable .

之后,当您恢复 Parceable 对象时,您应该使用:

private void readFromParcel(Parcel in) {
    brand = in.readString(); //To read String
}

您必须按照写入顺序从 in 对象中读取值。

这段代码:

public static final Parcelable.Creator<Car> CREATOR = new Parcelable.Creator<Car>() {
         public Car createFromParcel(Parcel in) {
             return new Car(in);
         }
}

需要调用readFromParcel方法。您应该在类中添加一个构造函数,以便从上面的代码中调用。 构造函数应该如下所示:

public Car(Parcel in) {
   readFromParcel(in);
}

关于方法describeContents ,Stackoverflow上有一个很好的答案,here .

总结一下,我从未见过使用这种方法的案例。如果您想在解析 Parcel 后释放资源,则可以使用该方法,但我在互联网上没有找到任何好的 Material 来解释它。您很可能会让它返回 0。 你可以找到它的Android文档here .

关于java - 在具有嵌套非原始元素的对象中实现 Parcelable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12944355/

相关文章:

android - Android 是否支持 Expo 计步器?

android - Parcelable vs 从数据库读取的效率

java - 有没有办法定义一个通用方法来检查 null 然后创建对象?

java - 在多个类中共享 Java 中的常量字符串?

java - 实现鼠标事件的正确方法

Javascript 检查是否单击了鼠标左键

java - 无法将行插入 MySQL 数据库

android - ViewPager.setCurrentItem 在 PagerAdapter 中返回错误的位置

android - 我传递的包裹是空的?

Android Intent 传递 parcelable 对象与传递 Json 字符串