我正在研究auto-value
及其扩展,即在我的Android应用程序中使用的auto-value-parcel
和auto-value-parcel-adapter
。
我有以下这些模型类:
@AutoValue
public abstract class Xenarchaeota implements Parcelable {
@ParcelAdapter(AmoebaTypeAdapter.class)
public abstract Set<Amoeba> amoebas();
public static Builder builder() {
return new AutoValue_Xenarchaeota.Builder();
}
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setAmoebas(Set<Amoeba> value);
public abstract Xenarchaeota build();
}
}
并且
@AutoValue
public abstract class Amoeba implements Parcelable {
public abstract String surname();
public static Builder builder() {
return new AutoValue_Amoeba.Builder();
}
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder surname(final String value);
public abstract Amoeba build();
}
}
我的类型适配器是出现问题的地方。
class AmoebaTypeAdapter implements TypeAdapter<Set<Amoeba>> {
@Override
public Set<Amoeba> fromParcel(Parcel in) {
final ArrayList<Amoeba> arrayList = new ArrayList<>();
in.readTypedList(arrayList, Amoeba.CREATOR); // How to access the CREATOR?
return new TreeSet<>(arrayList);
}
@Override
public void toParcel(Set<Amoeba> value, Parcel dest) {
final ArrayList<Amoeba> arrayList = new ArrayList<>(value);
dest.writeTypedList(arrayList);
}
}
我需要传递给 readTypedArray 的 CREATOR 在 AutoValue_Amoeba 中声明。
我的错误在哪里?是否误解了 auto-value-parcel?
List
,它将通过Parcel#writeValue(val)
进行往返传输,因此会有一些额外的方法调用和类型检查的性能损失。我认为这只是一个小问题,因为这是序列化,涉及其他性能问题(IPC等),但这取决于您。另一个选择是将其设置为数组,并像此处详细说明的那样进行包装。Parcelable[]直接被写入,但读取需要要读取类的类加载器(它使用反射来加载Creator)。 - rharter