2012-03-15 78 views
6

我在使用Android.Bundle通过两个活动发送ArrayList中的Parcelable数据时遇到问题Android |在包中使用Parcelable数据时解组未知类型

我有两个活动(A和B)。

在Aaaa.class:

ArrayList<Model> mModelList = new ArrayList<Model> 
//Fill ArrayList with a few Model-Objects 

Bundle mBundle = new Bundle; 
Intent mIntent = new Intent(Aaaa.this, Bbbb.class); 

mBundle.putParcelableArrayList("models", mModelList); 
mIntent.putExtras(mBundle); 

startActivity(mIntent); 

在Bbbb.class:

Bundle mBundle = getIntent().getExtras(); 
ArrayList<Model> = mBundle.getParcelableArrayList("models"); 

的Model.class正在实施Parcelable。

所以,问题是。 当我填充ArrayList(在Aaaa.class中)并将其放入Bundle时,我可以看到Bundle包含List中的varios对象。 当我然后尝试填充Bbbb.class中的列表异常被抛出。

ERROR/AndroidRuntime(11109): FATAL EXCEPTION: main 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{test/test.activities.Bbbb}: java.lang.RuntimeException: Parcel [email protected]: Unmarshalling unknown type code 7667810 at offset 144 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 
    at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:3687) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
    at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.RuntimeException: Parcel [email protected]: Unmarshalling unknown type code 7667810 at offset 144 
    at android.os.Parcel.readValue(Parcel.java:1913) 
    at android.os.Parcel.readListInternal(Parcel.java:2092) 
    at android.os.Parcel.readArrayList(Parcel.java:1536) 
    at android.os.Parcel.readValue(Parcel.java:1867) 
    at android.os.Parcel.readMapInternal(Parcel.java:2083) 
    at android.os.Bundle.unparcel(Bundle.java:208) 
    at android.os.Bundle.getParcelableArrayList(Bundle.java:1144) 
    at test.activities.Bbbb.onCreate(Bbbb.java:52) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) 
    ... 11 more 

Line52是

ArrayList<Model> = mBundle.getParcelableArrayList("models"); 

我是绝对不知道那里现在的问题是,在Model.class工作正常与其他软件包 - 意图。

更新:

模型类如下。

public class Model implements Parceleble{ 

    private String name; 
    private String address; 

    public Model(Parcel parcel){ 
    } 
    public Model(){ 
    } 
    public Model(String name, String address){ 
    this.name = name; 
    this.address = address; 
    } 

    //Getter and Setter 

    //equals, HashCode, toString (autoGenerated from Idea) 

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

    public void readFromParcel(Parcel parcel){ 
    this.name = parcel.readString(); 
    this.address = parcel.readString(); 
    } 

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

    @Override 
    public Model[] new Array(int size){ 
    return new Model[size] 
    } 
}; 
} 
+0

你可以发布你模型类? – yorkw 2012-03-15 21:25:46

+0

@yorkw按照您的意愿发布Model.class。 – Chris 2012-03-16 12:27:24

回答

5

你Parceleble实现看起来不正确的给我,请查看示例代码API,看看需要什么样的方法/构造函数,需要重写:

... ... 

// ==================== Parcelable ==================== 
public int describeContents() { 
    return 0; 
} 

public void writeToParcel(Parcel parcel, int flags) { 
    parcel.writeString(name); 
    parcel.writeString(address); 
} 

private Model(Parcel in) { 
    name = in.readString(); 
    address = in.readString(); 
} 

public static final Parcelable.Creator<Model> CREATOR = new Parcelable.Creator<Model>() { 
    public Model createFromParcel(Parcel in) { 
    return new Model(in); 
    } 

    public Model[] newArray(int size) { 
    return new Model[size]; 
    } 
}; 

... ... 

试试这个代码,看看它是否有帮助。

+0

嗨@yorkw非常感谢您的回复。问题在于模型的实现,特别是在parcel-Creator(私人模型(包裹))中。 – Chris 2012-03-21 08:30:16

+2

我不明白这段代码与OP提供的Model类代码有什么不同,或者它是否稍后更新? – 2013-06-14 12:04:16

+0

@ChristianGarcíaOP的实现缺少'describeContents'这个方法,它非常重要,因为它解释了包裹内部的对象。我希望你现在清楚。 – sud007 2016-09-26 06:04:18

1

我花了很长时间来发现那是什么,我认为有一个错误。 让我解释一下

如果你的模型具有字符串字段Android的不能恢复他们很好的方法

Parcel.readString() 

他试图将字符串转换,并给你一个未知类型的一样无知的人物。只要做一个测试,如果你使用一个没有字符串字段的可分类模型,它就完美地出现了。

我不知道该怎么做,为什么它会出现字符串字段。

为了解决这个问题,我想将模型对象列表传递给使用数据库的下一个活动,也许它不是更好的主意,但我没有另一个。