2012-03-15 9 views
6

yılında Parcelable Verilerini kullanırken Bilinmeyen Tipi unmarshalling Ben iki Aktiviteler (A ve B) sahip Android.BundleAndroid | Paketler

kullanarak iki Faaliyetleri aracılığıyla gönderilecek Bir ArrayList'in Parcelable Verilerle Sorun var. Aaaa.class yılında

:

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 In:

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

Model.class Parcelable uyguluyor.

Yani, Sorun. ArrayList (Aaaa.class) 'ı doldurup Bundle'a koyduğumda, Bundle Listesinden Objects varios nesnesini içerdiğini görebiliyorum. Daha sonra Bbbb.class'da Listeyi doldurmaya çalıştığımda bir Özel Durum Atılabilir. Intents -

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 ben, Model.class diğer Paketi ile iyi çalışıyor burada Sorun ise kesinlikle hiçbir fikrim yok

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

olduğunu.

Güncelleme:

Model Sınıfı aşağıdaki gibi.

... ... 

// ==================== 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]; 
    } 
}; 

... ... 

bu deneyin:

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 sınıfını gönderir misiniz? – yorkw

+0

@yorkw Model.class'ı dilediğiniz gibi gönderin. – Chris

cevap

5

Kişisel Parceleble uygulama bana pek doğru görünmüyor, geçersiz gereken gerekli yöntemi/yapıcı ne olacağını anlamak için API örnek kodu kontrol Kod ve yardımcı olup olmadığını görün.

+0

Merhaba @yorkw cevabınız için çok teşekkür ederim. Problem, modelin uygulanmasında, özellikle parsel-Yaratan (özel Model (parsel in) içinde) idi. – Chris

+2

Bu kod bloğunun OP tarafından sağlanan Model sınıf kodundan nasıl farklı olduğunu veya daha sonra güncelleştirilmesinin nasıl olduğunu göremiyorum. –

+0

@ ChristianGarcía OP'nin uygulaması, parselin içeriği hakkında açıklama yaptığı için oldukça önemli olan 'defineContents' yöntemini kaçırıyor (içindeki nesneler). Umarım şimdi anlaşılırsın. – sud007

1

Bunun ne olduğunu keşfetmek için uzun zaman harcadım ve bence bir hata var. beni açıklayalım:

Model dize varsa alanların Android edemez kurtarma onları çok iyi üzerinde yöntem O dizeyi dönüştürmek ve size bir benzeri bilinmeyen bir türü vermeye çalışır

Parcel.readString() 

bilinmeyen karakter. Sadece bir test yapmak, string alanları olmayan bir parcelable modeli kullanırsanız, mükemmel bir şekilde okur.

Ne yapacağını ve neden dize alanları ile karıştığını bilmiyorum.

Sorunu çözmek için, model nesnelerinin bir listesini veritabanını kullanarak bir sonraki etkinliğe geçirmeyi düşündüm, belki de daha iyi bir fikir değil, başka bir tane yok.