【问题标题】:Parceable causes StackoverflowParcelable 导致堆栈溢出
【发布时间】:2014-02-14 05:19:24
【问题描述】:

有两个类,以某种方式相互链接。如果我以这种方式实现 Parceable,则会出现 * 异常:

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

所以,我猜它会被 * 压垮,因为它试图在writeParcel(...) 中传递ArrayList&lt;RSSItems&gt;writeParcel(...) 中的哪一个尝试一次又一次地传递RSSFeed 成员。那么,问题是如何解决这个问题到 Parce 两个类呢?

【问题讨论】:

  • 确切的堆栈跟踪是?

标签: android parcelable stack-overflow


【解决方案1】:

您的对象图中有循环。您的RSSFeedRSSItems 放入包裹中,RSSItem 将父RSSFeed 放入包裹中。不要打包这些依赖项之一来终止循环。通常不应打包父关系,即从项目到提要。

【讨论】:

  • 感谢您的回复。我写道,我知道那是骑自行车。我只是希望有一个正确的方法来做到这一点。我同时使用 RSSFeed 和 RSSItem 类在活动之间传递,所以我需要从 RSSItem 类中获取 RSSFeed 项目。如果我不在 RSSItem 中打包“RSSFeed 提要”,当我将它传递给另一个活动时,我会错过它,不是吗?