Una mejor manera de manejar esto que evita la reflexión sería llamar simplemente el creador estática en el tipo de destino así:
this.amazingObject = AmazingObject.CREATOR.createFromParcel(in);
y escribirla en el Parcelable
usando this.amazingObject.writeToParcel(Parcel, int)
Internamente, cuando llamando readParcelable(ClassLoader)
esto sucede:
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);
}
Como se puede ver la última llamada de ese método es J ust llamando a la derecha Creator
pero dentro de readParcelableCreator
hay una gran cantidad de reflexión que podemos evitar simplemente llamándola directamente. llamadas
esta utilidad pueden ser útiles:
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);
}
}
¿Dónde está el 'A object' interior B? – iTurki