2012-03-15 75 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() 

他試圖將字符串轉換,並給你一個未知類型的一樣無知的人物。只要做一個測試,如果你使用一個沒有字符串字段的可分類模型,它就完美地出現了。

我不知道該怎麼做,爲什麼它會出現字符串字段。

爲了解決這個問題,我想將模型對象列表傳遞給使用數據庫的下一個活動,也許它不是更好的主意,但我沒有另一個。