I have two classes and I want to pass value between two activities. Those values are an ArrayList of a custom Object.
When I call getParceableArrayListExtra
I get an UnmarshallingException
. Here is my call:
protected void someCall() {
Intent intent = new Intent();
ArrayList<A> myArray = new ArrayList<>()
intent.putParcelableArrayListExtra("key", myArray);
setResult(RESULT_OK, intent);
finish();
}
The reception :
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
data.getParcelableArrayListExtra("key"); // There it crashes
}
A is something like :
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());
}
Object 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];
}
};
If I replace my ArrayList<A>
with only A
(putExtra
/ getParcelableExtra
) it works.
I'm kinda lost there. Any suggestions?
Here is the trace :
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.
EDIT : Oh, I forgot to mention I did implement describe content for all class that implements Parceable. It returns 0 for each one.
EDIT 2 : I tried to delete reference to B and pass ArrayList. It works
EDIT 3 : I deleted Enum. It works too. So it looks like you're right. My enum implementation is bad.