1

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

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

但是,当我实现它无需增加CREATOR和离开writeToParcel()空的应用程序似乎仍正常工作。有时我会得到一个Bad Parcelable Exception,但我无法制定复制步骤。

这是我用它来传递一个对象从活动片段

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

那么,什么是添加的东西一样out.writeInt(mData);可以预期什么样的问题的目的,如果不这样做?

回答

4

可执行的实现主要有两个过程步骤。

1将您的java对象写入包含两种方法的包裹

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

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

其中描述的内容是为您的内容设置标志。大部分时间你只需要它不变。

public void writeToParcel(Parcel dest,int flags),您需要根据JAVA类中的字段逐步将您的Java类对象编写为包。在上面的例子中,我的课有三个字符串。您可以在宗地中编写几乎所有类型的对象。你只需要选择适当的一个。像writeString(),写列表()或writeObject()等

2.第二部分是从包裹

阅读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。它从包裹中读取城市对象。但它叫城市类的新市(中)的构造函数。所以现在我需要一个构造函数来接受参数中的parcel对象。让我们创造这个..

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

现在我们做一个类完整的充分证明parcelable。有一点需要注意,我们需要在受保护的城市(包裹)中读取相同顺序的成员,我们将它们放入包裹中,即写入到writeToParcel()方法中。

关于如何重现badParcelable exeption中简单地让android从parcelable创建java对象。为此,您可以选择从Android设备上的开发人员选项中销毁活动,并将您的应用程序放在该活动的后台中,以便Android终止您的应用程序进程ID。通过重新创建活动(onCreate + Bundle)来恢复您的应用程序,如果您未正确实施parcelable,则会发生该异常。

2

但是,当我实现它,而不添加CREATOR并将writeToParcel()留空应用程序仍然似乎正常工作。

CREATOR用于从Parcel中读取数据并将其转换回对象。

writeToParcel()将您的数据存入Parcel

如果您的Parcelable实际上未被放入Parcel或从Parcel重新构成,那么将其关闭的唯一方法将正常工作。示例包括LocalBroadcastManager

添加像out.writeInt(mData)这样的东西的目的是什么?

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

+0

我在显示如何使用parcelable的问题中添加了一个片段。你可以看看,也许这就是我使用它是错的? –

+0

@AdrianHristov:最终,'Bundle'可以放入'Parcel'中,并通过进程边界发货。在这种情况下,我不确定何时。我们知道它发生了,就像Android在后台中终止你的进程一样,但是用户在离开它后很快返回到你的应用程序(例如30秒),我们的状态得到恢复,唯一可行的方法是如果我们的状态处于核心操作系统进程(而不是刚刚终止的进程)。 – CommonsWare

相关问题