gpt4 book ai didi

java - Parcelable 继承 : abstract class - Which CREATOR?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:05:11 25 4
gpt4 key购买 nike

我有一个实现了 Parcelable 的抽象类 A

我有一个 B 类和一个 C 类,它们都扩展了 A。我怎样才能使它们可打包?

因为我可以将它链接起来并在 AB 中提供一个 CREATOR,就像许多帖子中建议的那样。但是由于我有其他存储 A-B-C 类并实现 Parcelable 本身的对象,这种方法似乎不起作用,因为当我想传递 A 的 ArrayList 时,我会在类型列表中使用 CREATOR

ArrayList<A> elements = new ArrayList<>();
in.readTypedList(elements , B.CREATOR); // B.CREATOR? C.CREATOR???

这显然没有意义。那么我怎样才能正确地制作一个 Parcelable?

也就是说,我想让这个类成为 Parcelable,这样我就可以用一种通用的方式引用 A。

A)

public abstract class A implements Parcelable {

final String globalVar;

public A(String globalVar) {
this.globalVar = globalVar;
}
}

B)

public class B extends A {

String bVar;


public B(String global, String bVar) {
super(global);
this.bVar = bVar;
}

private B(Parcel in) {
super(in.readString());
this.bVar = in.readString();
}


@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(bVar);
}
}

C)

public class C extends A {

String cVar;


public C(String global, String cVar) {
super(global);
this.cVar = cVar;
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(cVar);
}
}

最佳答案

我使用了这篇博文中 Vincent Mimoun-Prat 的可分割架构:Parcelable and inheritance in Android并遇到了关于必须指定不可能的抽象 CREATOR 的相同类型化列表问题。

在 Parcel 的 JavaDoc 中搜索我找到了方法 writeList(List val)内部使用 writeValue(Object)列表中每个对象的方法,因此从子类(A 列表中的 B 和 C)调用 writeToParcel()。要解码列表,请使用其对应项 readList (List outVal, ClassLoader loader)其中必须传递 A ClassLoader 或抛出 android.os.BadParcelableException,至少在我的情况下是这样。

包含 A 元素列表的类应该是这样的:

public class AContainer implements Parcelable {
//Other AContainer fields
List<A> elements = new ArrayList<>();
//Other AContainer fields

static final Parcelable.Creator<AContainer> CREATOR = new Parcelable.Creator<AContainer>() {
@Override
public AContainer createFromParcel(Parcel source) {
return new AContainer(source);
}

@Override
public AContainer[] newArray(int size) {
return new AContainer[size];
}
};

public AContainer() {
}

protected AContainer(Parcel source) {
//read other AContainer fields
source.readList(elements, A.class.getClassLoader());
//read other AContainer fields
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
//write other AContainer fields
dest.writeList(elements);
//write other AContainer fields
}
}

使用这些方法可能比 readTypedList()writeTypedList() 慢一点,但是来自 B 和 C 子类的特定数据也被“分割”,而不仅仅是来自抽象父类(super class)的字段(不可能是抽象的)。您从 B 和 C 恢复正确的实例。

关于java - Parcelable 继承 : abstract class - Which CREATOR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28567735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com