2

在Android中实现Parcelable接口的正确方法是什么?根据文档,您应该实现该writeToParcel方法并拥有一个CREATOR.

public void writeToParcel(Parcel out, int flags) {
     out.writeInt(mData);
 }

但是,当我在不添加 aCREATOR并将其writeToParcel()留空的情况下实现它时,应用程序似乎仍然可以正常工作。有时我会得到一个Bad Parcelable Exception,但我无法制定出复制的步骤。

这就是我用来将对象从活动传递到片段的方式

 Bundle bundle = new Bundle();
 bundle.putParcelable(PageFragment.PAGE_FILTER_KEY, page);
 fragment.setArguments(bundle);

那么,添加诸如out.writeInt(mData);如果不这样做会出现什么样的问题之类的东西的目的是什么?

4

2 回答 2

4

Parcelable 实现主要有两个处理步骤。

1 将您的 java 对象写入 Parcel,其中包括两种方法

  @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(cityName);
        dest.writeString(macroName);
        dest.writeString(id);
    }

其中 describe content 用于为您的内容设置标志。大多数时候你只需要保持原样。

public void writeToParcel(Parcel dest, int flags) ,你需要根据 JAVA 类中的字段一步步编写你的 Java 类对象到 parcel。在上面的例子中,我的类有三个字符串。您可以在包裹中写入几乎所有类型的对象。你只需要选择一个合适的。像 writeString()、writeList() 或 writeObject() 等。

2.第二部分是从包裹中读取你的java对象

这部分也需要两件事。首先是你的java类的创建者,如下所示

 public static final Creator<City> CREATOR = new Creator<City>() {
        @Override
        public City createFromParcel(Parcel in) {
            return new City(in);
        }

        @Override
        public City[] newArray(int size) {
            return new City[size];
        }
    };

在上面的例子中,我的 Java 类是 City。它使从包裹中读取城市对象。但它调用City类的 new City(in) 构造函数。所以现在我需要一个在参数中接受包裹对象的构造函数。让我们也创建它..

 protected City(Parcel in) {
        cityName = in.readString();
        macroName = in.readString();
        id = in.readString();
    }

现在我们让一个类完整的完整证明可打包。需要注意的一件事是,我们需要在 受保护的城市(Parcel in)以相同的顺序读取成员, 我们将它们放在 Parcel 中,即在 writeToParcel() 方法中。

关于如何在简单地让 android 从 parcelable 创建 java 对象时重现 badParcelable 异常。为此,您可以从 android 设备上的开发人员选项中选择 Destroy 活动,并将您的应用程序置于该活动的后台,以便 android 杀死您的应用程序进程 ID。通过重新创建活动(onCreate + Bundle)来恢复您的应用程序,如果您没有正确实现 parcelable,您将收到该异常。

于 2016-02-13T17:54:47.590 回答
2

但是当我在不添加 CREATOR 并将 writeToParcel() 留空的情况下实现它时,应用程序似乎仍然可以正常工作。

CREATOR在从 a 中读取数据Parcel并将其转换回对象时使用。

writeToParcel()将您的数据放入Parcel.

让这些关闭正常工作的唯一方法是在您Parcelable实际上没有被放入 aParcel或从 a 重组的情况下Parcel。示例包括LocalBroadcastManager.

添加类似 out.writeInt(mData); 之类的东西的目的是什么?

这与添加类似 : 的内容的目的相同,out.write()OutputStream写入输出。你的问题类似于问“嘿,如果我不将数据写入我的文件,我会遇到什么样的问题?”。

于 2016-02-13T16:32:33.737 回答