android - 实现 Parcelable 的正确方法

标签 android android-intent parcelable badparcelableexception

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

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

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

这就是我用来将对象从 Activity 传递到 Fragment 的方式

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

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

最佳答案

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类对象来包裹。在上面的例子中,我的类(class)有三个字符串。您几乎可以在 parcel 中写入所有类型的对象。你只需要选择一个合适的。如 writeString(),writeList() 或 writeObject() 等

<强>2。第二部分是从 parcel 中读取你的 java 对象

这部分还需要两件事。首先是您的 java 类的 CREATOR,如下所示

 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();
    }

现在我们制作一个完整的完整证明可打包的类。需要注意的一件事是,我们需要在 protected City(Parcel in) 中读取相同顺序的成员,我们将它们放在包裹中,即在 writeToParcel() 方法中。

关于如何通过简单地让 android 从 parcelable 创建 java 对象来重现 badParcelable 异常。为此,您可以从 Android 设备的开发人员选项中选择“销毁 Activity ”,并将您的应用程序置于该 Activity 的后台,这样 Android 就会终止您的应用程序进程 ID。通过重新创建 Activity (onCreate + Bundle) 恢复您的应用程序,如果您没有正确实现 parcelable,您将得到该异常。

关于android - 实现 Parcelable 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35382329/

相关文章:

Android 鼠标光标事件/dev/uinput 不在 Y 轴上移动

java - 来自 Android 应用程序的 Last.fm API 调用

java - 我的上下文菜单中有一个简单的错误,有人可以解决吗?

android - 从 Intent 检索时包裹崩溃

java - Parcelable 对象错误 : Unmarshalling unknown type code *** at offset ***

android - 如何添加 RecyclerView 依赖 - gradle 3

android - 蓝牙连接状态更改时防止onDestroy

java - 有意停止服务

android - 如何在eclipse中调试子项目中的Intent

java - Android运行时错误: Parcel unable to marshal value