Một cách tốt hơn để xử lý này mà tránh phản xạ sẽ được chỉ cần gọi tác giả tĩnh trong các loại mục tiêu như thế này:
this.amazingObject = AmazingObject.CREATOR.createFromParcel(in);
và ghi nó vào Parcelable
sử dụng this.amazingObject.writeToParcel(Parcel, int)
Bên trong, khi gọi readParcelable(ClassLoader)
điều này xảy ra:
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);
}
Như bạn có thể thấy lời gọi cuối cùng của phương thức đó là j ust gọi đúng Creator
nhưng bên trong readParcelableCreator
có rất nhiều phản xạ mà chúng ta có thể tránh bằng cách chỉ cần gọi trực tiếp. cuộc gọi
Tiện ích này có thể hữu ích:
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);
}
}
Đâu là 'Một object' bên B? – iTurki