2014-01-23 1 views
1

Существует два класса, которые связывают друг с другом. Проблема оказывает StackOverflow исключение, если я реализует 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 двух классов?

+0

и точный stacktrace есть? –

ответ

1

У вас есть циклы в графе объектов. Ваш RSSFeed положил RSSItem s в посылке, RSSItem помещает родителя RSSFeed в посылку. Не уничтожайте одну из этих зависимостей, чтобы убить цикл. Обычно родительские отношения, то есть от элемента к каналу, не должны быть разделены.

+0

Спасибо за ответ. Я написал, что знаю, что это велоспорт. Я просто надеюсь, что есть правильный способ сделать это. Я использую как классы RSSFeed, так и классы RSSItem для передачи между действиями, поэтому мне нужно получить элемент RSSFeed из класса RSSItem. Если я не помещу «RSSFeed Feed» в RSSItem, я пропущу его, когда передам его другому мероприятию, нет? – reel