2012-03-15 20 views
6

にParcelableデータを使用している間、私は2つのアクティビティ(AとB)を持っているAndroid.BundleAndroid |アンマーシャリング不明なタイプバンドル

を使用して、2つの活動を経て送信ArrayListの中Parcelableのデータに問題があります。 Aaaa.classで

:Bbbb.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); 

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

Model.classはParcelableを実施しています。

したがって、問題は次のとおりです。 ArrayList(Aaaa.class)を塗りつぶしてBundleに配置すると、BundleにリストのVariosオブジェクトが含まれていることがわかります。 その後、Bbbb.classのListを埋めると例外がスローされます。インテント -

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は、私は、Model.classは他のバンドルと正常に動作して、ここで問題があるabsolutly見当がつかない

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

です。

更新:

従うモデルクラス。

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

Modelクラスを投稿できますか? – yorkw

+0

@yorkw希望通りにModel.classをポストします。 – Chris

答えて

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ご返信ありがとうございます。問題は、モデルの実装では、区画作成者(私的モデル(区画))であった。 – Chris

+2

このコードブロックがOPで提供されているModelクラスコードとどのように違うのですか、それとも後で更新されたのでしょうか? –

+0

@ChristianGarcíaOPの実装には、 'describeContents'というメソッドがありません。これは、パーセルの内容について説明するので非常に重要です(内部のオブジェクト)。私はあなたが今はっきりと願っています。 – sud007

1

私はそれが何かを発見するのに長い時間を費やしてきました。私はバグがあると思います。 私はを説明しましょう:

をお使いのモデルは、文字列を持っている場合はフィールドアンドロイドことはできません回復彼らは非常によく上のメソッド彼は文字列を変換し、あなたにのような未知のタイプを与えることを試みる

Parcel.readString() 

文字を知らない。テストを行うだけで、文字列フィールドを持たないパーセル可能なモデルを使用すると、それは完璧に動作します。

私は何をすべきか、それがなぜ文字列フィールドでなぜ発生するのかわかりません。

問題を解決するために、モデルオブジェクトのリストをデータベースを使用して次のアクティビティに渡すことを考えましたが、おそらくそれは良いアイデアではありませんが、別のアクティビティはありません。

関連する問題