传递ArrayList时解组,但传递item时不解组

时间:2016-12-18 22:35:40

标签: java android arraylist

我有两个类,我想在两个活动之间传递值。这些值是自定义对象的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 :我删除了枚举。它也有效。所以看起来你是对的。我的枚举实现很糟糕。

0 个答案:

没有答案