有两个类,以某种方式彼此链接。问题是如果我以这种方式实现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两个类的问题? 最佳答案
您的对象图中有循环。您的RSSFeed
将RSSItem
放入包裹中,而RSSItem
则将父级RSSFeed
放入包裹中。不要打包这些依赖项之一来杀死周期。通常,父项关系,即从项目到Feed的父项关系不应该被包裹。