2014-01-23 75 views
1

有兩個類,彼此之間相互鏈接。問題是有異常#1,如果我實現Parceable這樣:Parcelable cause 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兩個類?

+0

和確切的堆棧跟蹤是? –

回答

1

在對象圖中有周期。您的RSSFeedRSSItem放入包裹中,RSSItem將父件RSSFeed放入包裹中。不要打包這些依賴關係中的一個來殺死這個循環。通常情況下,父母之間的關係,即從項目到飼料不應被分類。

+0

感謝您的回覆。我寫道,我知道那是騎自行車。我只是希望有一個正確的方法來做到這一點。我使用RSSFeed和RSSItem類在活動之間傳遞,因此我需要從RSSItem類獲取RSSFeed項。如果我在RSSItem中沒有Parcel'RSSFeed feed',當我將它傳遞給另一個活動時,我會錯過它,不是嗎? – reel