1

There is two classes, link each other someway. Problem is having Stackoverflow exception if I implements Parceable this way:

RSSFeed.java

 public class RSSFeed implements Parcelable {
    private String title;
    private String link;
    private ArrayList<RSSItem> rssItems;

public RSSFeed() {
    rssItems = new ArrayList<RSSItem>();
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeStringArray(new String[] { this.title, this.link });
    Bundle b = new Bundle();
    b.putParcelableArrayList("rssItems", rssItems);
    dest.writeBundle(b);

}

public static final Parcelable.Creator<RSSFeed> CREATOR = new Parcelable.Creator<RSSFeed>() {
    @Override
    public RSSFeed createFromParcel(Parcel in) {
        RSSFeed rssFeed = new RSSFeed();

        String[] data = new String[2];
        in.readStringArray(data);
        rssFeed.title = data[0];
        rssFeed.link = data[1];

        Bundle b = in.readBundle(RSSItem.class.getClassLoader());
        rssFeed.rssItems = b.getParcelableArrayList("rssItems");
        return rssFeed;
    }

    @Override
    public RSSFeed[] newArray(int size) {
        return new RSSFeed[size];
    }
};

RSSItem.java

public class RSSItem implements Parcelable {
private RSSFeed feed;
private String title;

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    Bundle b = new Bundle();
    b.putParcelable("feed", this.feed);
    dest.writeStringArray(new String[] { this.title });
}

public static final Parcelable.Creator<RSSItem> CREATOR = new Parcelable.Creator<RSSItem>() {
    @Override
    public RSSItem createFromParcel(Parcel in) {
        RSSItem rssItem = new RSSItem();

        Bundle b = in.readBundle(RSSFeed.class.getClassLoader());
        rssItem.feed = b.getParcelable("feed");

        String[] dataString = new String[1];
        in.readStringArray(dataString);
        rssItem.setTitle(dataString[0]);

        return rssItem;
    }

    @Override
    public RSSItem[] newArray(int size) {
        return new RSSItem[size];
    }
};

So, it crushes with stackoverflow I guess because it's trying in writeParcel(...) to pass ArrayList<RSSItems> which one in writeParcel(...) try to pass RSSFeed member and again and again. So, the question is how to solve this problem to Parce two classes?

reel
  • 189
  • 7

1 Answers1

1

You have cycles in your object graph. Your RSSFeed put RSSItems in the parcel, an RSSItem puts the parent RSSFeed in the parcel. Do not parcel one of these dependencies to kill the cycle. Usually the parent relationship i.e. from item to feed should not be parceled.

laalto
  • 150,114
  • 66
  • 286
  • 303
  • Thanks for reply. I wrote that I know that is cycling. I just hope that there is a right way to do that. I use both RSSFeed and RSSItem classes to pass between Activities, so I need to get RSSFeed item from RSSItem class. If I dont Parcel 'RSSFeed feed' in RSSItem I will miss it when I pass it to another activity, no? – reel Jan 23 '14 at 15:20