The best way to handle this, which avoids reflection, is to simply call the static creator in the target type as follows:
this.amazingObject = AmazingObject.CREATOR.createFromParcel(in);
and write it to Parcelable using this.amazingObject.writeToParcel(Parcel, int)
Internally, when calling readParcelable(ClassLoader) this happens:
public final <T extends Parcelable> T readParcelable(ClassLoader loader) { Parcelable.Creator<T> creator = readParcelableCreator(loader); if (creator == null) { return null; } if (creator instanceof Parcelable.ClassLoaderCreator<?>) { return ((Parcelable.ClassLoaderCreator<T>)creator).createFromParcel(this, loader); } return creator.createFromParcel(this); }
As you can see, the last call to this method simply calls the right Creator , but inside readParcelableCreator there is a lot of reflection that can be avoided by simply calling it directly.
This utility may be useful:
import android.os.Parcel; import android.os.Parcelable; public class Parcels { public static void writeBoolean(Parcel dest, Boolean value) { dest.writeByte((byte) (value != null && value ? 1 : 0)); } public static Boolean readBoolean(Parcel in){ return in.readByte() != 0; } public static void writeParcelable(Parcel dest, int flags, Parcelable parcelable) { writeBoolean(dest, parcelable == null); if (parcelable != null) { parcelable.writeToParcel(dest, flags); } } public static <T extends Parcelable> T readParcelable(Parcel in, Parcelable.Creator<T> creator) { boolean isNull = readBoolean(in); return isNull ? null : creator.createFromParcel(in); } }
pablisco Sep 15 '14 at 15:47 2014-09-15 15:47
source share