2013-04-01 13 views
19

Próbuję paczkować obiekt zawierający pewne zmienne string/int i zmienną obiektową. Struny i int działają, ale nie obiekt zagnieżdżony. Rozumiem, że musiałabym go również podzielić, ale najwyraźniej robię coś źle =. W mojej klasie zagnieżdżonej wywoływana jest metoda writeToParcel (sprawdzam z rozmową Log.d()), ale createFromParcel() nie. W efekcie otrzymuję obiekt null. To jest mój uproszczony kod:Zagnieżdżony obiekt paczkowany nie czytający

public class MyClass implements Parcelable { 

    public MyClass() { 
    } 

    private Integer id; 
    private String name;  
    private MyOtherClass otherClass = new MyOtherClass(); 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public OtherClass getOtherClass() { 
     return otherClass; 
    } 

    public void setOtherClass(OtherClass otherClass) { 
     this.otherClass = otherClass; 
    } 

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

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

    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(name); 
     dest.writeInt(id); 
     dest.writeParcelable(otherClass, flags); 
    } 

    private MyClass(Parcel in) { 
     name = in.readString(); 
     id = in.readInt(); 
     otherClass = (OtherClass) in.readParcelable(OtherClass.class.getClassLoader()); 
    } 
} 

class MyOtherClass implements Parcelable { 

    public OtherClass() { 
    } 

    private String resourcePreviewURL; 

    public String getResourcePreviewURL() { 
     return resourcePreviewURL; 
    } 

    public void setResourcePreviewURL(String resourcePreviewURL) { 
     this.resourcePreviewURL = resourcePreviewURL; 
    } 

    public int describeContents() { 
     return 0; 
    } 

    public void writeToParcel(Parcel out, int flags) { 
     Log.d("parcel", "write to parcel"); // this gets called 
     out.writeString(resourcePreviewURL); 
    } 

    public static final Parcelable.Creator<MyOtherClass> CREATOR 
      = new Parcelable.Creator<MyOtherClass>() { 
     public MyOtherClass createFromParcel(Parcel in) { 
      Log.d("parcel", "create from parcel"); // this doesn't get called 
      return new MyOtherClass(in); 
     } 

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

    private OtherClass(Parcel in) { 
      Log.d("parcel", "read from parcel"); // this doesn't get called 
     resourcePreviewURL = in.readString(); 
    } 

} 

Odpowiedz

60

Rozwiązałem to przez zmianę kolejności, w jakiej ja zapisu/odczytu z paczki. Wykonałem połączenia dest.writeParcelable(otherClass, flags); i otherClass = (OtherClass) in.readParcelable(OtherClass.class.getClassLoader()); jako pierwsze w swoich metodach i zaczęło działać. Czy to jest problem?

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeParcelable(otherClass, flags); 
    dest.writeString(name); 
    dest.writeInt(id); 
} 

private MyClass(Parcel in) { 
    otherClass = (OtherClass) in.readParcelable(OtherClass.class.getClassLoader()); 
    name = in.readString(); 
    id = in.readInt(); 
} 
+0

Nie można uzyskać .. –

+0

@MohitSharma, Właśnie zmieniłem kolejność, w której czytam/piszę. "OtherClass" powinien być pierwszym, który zostanie odczytany/napisany z/do "Paczki" – iomartin

+3

, dlaczego zamówienie ma znaczenie? – Zyoo

Powiązane problemy