有两个类,以某种方式彼此链接。问题是如果我以这种方式实现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两个类的问题?

最佳答案

您的对象图中有循环。您的RSSFeedRSSItem放入包裹中,而RSSItem则将父级RSSFeed放入包裹中。不要打包这些依赖项之一来杀死周期。通常,父项关系,即从项目到Feed的父项关系不应该被包裹。

07-27 23:40