我有两个类,我想在两个活动之间传递值。这些值是自定义对象的ArrayList。
当我致电getParceableArrayListExtra
时,我得到UnmarshallingException
。这是我的电话:
protected void someCall() {
Intent intent = new Intent();
ArrayList<A> myArray = new ArrayList<>()
intent.putParcelableArrayListExtra("key", myArray);
setResult(RESULT_OK, intent);
finish();
}
接待处:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
data.getParcelableArrayListExtra("key"); // There it crashes
}
A类似于:
public class A implements Parceable {
B objectB
String string
}
public void writeToParcel(Parcel out, int flags) {
out.writeString(string);
out.writeParcelable(b, flags);
}
public static final Parcelable.Creator<A> CREATOR = new Parcelable.Creator<>() {
public A createFromParcel(Parcel in) {
return new A(in);
}
public A[] newArray(int size) {
return new A[size];
}
};
private A(Parcel in) {
string = in.readString();
objectB = in.readParcelable(B.class.getClassLoader());
}
对象B:
public class B implements Parceable {
Enum enum;
Bitmap image;
String string;
public enum Enum implements Parceable {
One, Two;
private String name = "";
public void writeToParcel(Parcel out, int flags) {
out.writeString(One.name);
out.writeString(Two.name);
}
public static final Parcelable.Creator<Enum> CREATOR = new Parcelable.Creator<Enum>() {
public Enum createFromParcel(Parcel in) {
return Enum()[in.readInt()];
}
public Enum[] newArray(int size) {
return new Enum[size];
}
};
public B(Parcel in) {
readFromParcel(in);
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(string);
out.writeParcelable(image, flags);
out.writeParcelable(enum, flags);
}
private void readFromParcel(Parcel in) {
string = in.readString();
image = in.readParcelable(Bitmap.class.getClassLoader());
enum = in.readParcelable(Enum.class.getClassLoader());
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public B createFromParcel(Parcel in) {
return new B(in);
}
public B[] newArray(int size) {
return new B[size];
}
};
如果我仅使用ArrayList<A>
(A
/ putExtra
)替换getParcelableExtra
,则可行。
我有点迷失在那里。有什么建议吗?
这是跟踪:
FATAL EXCEPTION: main
Process: me, PID: 7222
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=-1, data=Intent { (has extras) }} to activity {me/myActivity}: java.lang.RuntimeException: Parcel android.os.Parcel@f4267b9: Unmarshalling unknown type code 6815811 at offset 40964
at android.app.ActivityThread.deliverResults(ActivityThread.java:3699)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@f4267b9: Unmarshalling unknown type code 6815811 at offset 40964
at android.os.Parcel.readValue(Parcel.java:2319)
at android.os.Parcel.readListInternal(Parcel.java:2633)
at android.os.Parcel.readArrayList(Parcel.java:1914)
at android.os.Parcel.readValue(Parcel.java:2264)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2592)
at android.os.BaseBundle.unparcel(BaseBundle.java:221)
at android.os.Bundle.getParcelable(Bundle.java:786)
at android.content.Intent.getParcelableExtra(Intent.java:5377)
at fr.azurmobile.florenttaine.livraison.Controller.LivraisonActivity.onActivityResult(activity.java:709)
at android.app.Activity.dispatchActivityResult(Activity.java:6428)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
I/Process: Sending signal. PID: 7222 SIG: 9
Application terminated.
编辑:哦,我忘了提到我为所有实现Parceable的类实现了描述内容。它为每个返回0。
编辑2 :我尝试删除对B的引用并传递ArrayList。它的工作原理
编辑3 :我删除了枚举。它也有效。所以看起来你是对的。我的枚举实现很糟糕。