Android Parcelable Inside Another Parcelable
It is too consuming to pass data using Java serializablein Android. Whereas, Android offers an other powerful tool: Parcelable.
Here is a guide of using Parcelable.
And there will be somewhat uncomfortable when you will reference some parcelable classes, especially ParcelableArray inside another Parcelable.
I found three efficient ways to do that:
-
TypedArray
-
TypedList
-
ParcelableArray
Scenario
We have two Classes, one is Author, the other is Book.
In the Book Class, we have a member variable public Author[] authors.
So, the problem is how we pass Book between activities with Parcels.
TypedArray
Two normal ways are using TypedArray or TypedList.
In the public void wirteToParcel(Parcel dest, int flags) method of Book Class:
Parcelable.Creator<Author> authorAarray = Author.CREATOR;
Author[] aps = authorAarray.
, and in private void readFromParcel(Parcel in) method,
authors = Author.CREATOR.newArray(authorsParcel.length);
int i = 0;
for(Parcelable p : authorsParcel) {
authors[i] = Author.CREATOR.createFromParcel(new Parcel(p));
i++;
}
TypedList
In writeToParcel method:
ArrayList<Author> authorInfo = new ArrayList<Author>();
for(int i=0;i<authors.length;i++){
authorInfo.add(authors[i]);
}
parcel.writeTypedList(authorInfo);
, and in Parcelable.Creator<Book> CREATOR
public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() {
public Book createFromParcel(Parcel source) {
...
ArrayList<Author> authors = new ArrayList<Author>();
source.readTypedList(authors, Author.CREATOR);
book.authors = new Author[authors.size()];
for(int i=0;i<authors.size();i++){
book.authors[i] = authors.get(i);
}
...
return book;
}
...
};
ParcelableArray
In writeToParcel method, it is quite simple:
dest.writeParcelableArray(authors, flags);
, as simple as in readFromParcel method:
authors = (Author[]) in.readParcelableArray(Author.class.getClassLoader());
, and in a Constructor of Book Class:
public Book(Parcel in) {
...
Parcelable[] parcelableArray =
in.readParcelableArray(Author.class.getClassLoader());
if (parcelableArray != null) {
this.authors = Arrays.copyOf(parcelableArray, parcelableArray.length, Author[].class);
}
...
}
In all the three cases above, there is no need to make any futher modification in the Author Class, just let it as simple as the most common Class who implements the Parcelable interface.
No matter a in.read... function is written in readFromParcel method, or a CREATOR, or even a Constructor, there should be the same style as mentioned in these three cases. The important part is how we translate the Author[] authors from Parcel source.