避免反射的更好的处理方法是简单地调用目标类型中的静态创建者,如下所示:
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);
}
}