Parcelable导致Stack Overflow

时间:2014-01-23 15:06:10

标签: android parcelable stack-overflow

有两个课程,相互联系。如果我以这种方式实现Parceable,则问题是出现Stackoverflow异常:

  

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

所以,我认为它会因stackoverflow而崩溃,因为它试图在writeParcel(...)中传递ArrayList<RSSItems> writeParcel(...)中的哪一个试图通过RSSFeed成员再次然后再次。那么,问题是如何解决Parce这两个类的问题呢?

1 个答案:

答案 0 :(得分:1)

您的对象图中有周期。您的RSSFeedRSSItem放入地块,RSSItem将父RSSFeed放入地块。不要包含其中一个依赖项来杀死循环。通常,父项关系,即从项目到饲料的关系不应该被分割。