Лучший способ справиться с этим, избегая рефлексии, — просто вызвать статического создателя в целевом типе следующим образом:
this.amazingObject = AmazingObject.CREATOR.createFromParcel(in);
и запишите его в Parcelable
с помощью this.amazingObject.writeToParcel(Parcel, int)
Внутри при вызове readParcelable(ClassLoader)
происходит следующее:
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);
}
Как вы можете видеть, последний вызов этого метода просто вызывает правильный Creator
, но внутри readParcelableCreator
есть много размышлений, которых мы можем избежать, просто вызвав его напрямую.
Эти служебные вызовы могут быть полезны:
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);
}
}
person
pablisco
schedule
15.09.2014
A object
внутри B? - person iTurki   schedule 03.09.2012