2013-08-11 6 views
8

बल्कि सरल परिदृश्य वास्तव में, लेकिन मैं तो यहाँ गूगल पर संबंधित कुछ भी नहीं मिला है:एंड्रॉयड parcelable एक और parcelable परिपत्र निर्भरता को संदर्भित

class ContainerClass implements Parcelable { 
    List<ItemClass> _items; 
    (...) 

    public void writeToParcel(Parcel p, int args) { 
    p.writeList(_items); 
    (...) 
    } 
} 

class ItemClass implements Parcelable { 
    ContainerClass _containerRef;  
    (...) 

    public void writeToParcel(Parcel p, int args) { 
    p.writeParcelable(_containerRef); 
    (...) 
    }  
} 

यह अनिवार्य रूप से पाश होगा और ढेर अतिप्रवाह।

मेरा प्रश्न: मुझे ऐसी परिस्थिति से कैसे निपटना चाहिए जहां मुझे उपरोक्त प्रकार की वस्तु को एक नई गतिविधि के माध्यम से पारित करना है।

(कॉमन्सवेयर के लिए) पार्सल करने योग्य कार्यान्वयन वास्तव में जांच नहीं करता है, और परिपत्र निर्भरताओं से बचता है। ऊपर नामों से बदल classnames साथ स्टैकट्रेस: ​​

08-12 10:17:45.233 5590-5590/com.package E/AndroidRuntime: FATAL EXCEPTION: main 
     java.lang.StackOverflowError 
     at com.package.ContainerClass.writeToParcel(ContainerClass.java:139) 
     at android.os.Parcel.writeParcelable(Parcel.java:1254) 
     at com.package.ItemClass.writeToParcel(ItemClass.java:182) 
     at android.os.Parcel.writeParcelable(Parcel.java:1254) 
     at android.os.Parcel.writeValue(Parcel.java:1173) 
     at android.os.Parcel.writeList(Parcel.java:622) 
     at com.package.ContainerClass.writeToParcel(ContainerClass.java:144) 
     at android.os.Parcel.writeParcelable(Parcel.java:1254) 
     at com.package.ItemClass.writeToParcel(ItemClass.java:182) 
     at android.os.Parcel.writeParcelable(Parcel.java:1254) 
     at android.os.Parcel.writeValue(Parcel.java:1173) 
     at android.os.Parcel.writeList(Parcel.java:622) 

उत्तर

1

मैं कुछ और अधिक विचार किया गया है और दो तरीके दिए उपयोगी अगर किसी और को एक ही नाव में है के साथ आते हैं:

1) (CommonsWare से प्रेरित होकर) इंगित करने के लिए श्रृंखला के प्रत्येक हिस्से पर एक झंडा रखो दिशा उत्तराधिकारी इस अर्थ में हानिकारक है कि कंटेनर क्लास के सभी आइटम बहाल नहीं किए जा सकते हैं।

class ContainerClass implements Parcelable { 
    boolean _parcelableDownHeirarchy = true; 
    List<ItemClass> _items; 
    (...) 

    private ContainerClass(Parcel in) { 
    _items = in.readArrayList(ItemClass.class.getClassLoader()); 
    (...) 

    if (_parcelableDownHierarchy) { 
     for (int i = 0; i < _items.size(); i++) 
     _items.get(i).set_container(this); 
    }   
    } 

    public void writeToParcel(Parcel p, int args) { 
    p.writeByte((byte)_parcelableDownHierarchy ? 1 : 0); 
    if (_parcelableDownHeirarchy) 
     p.writeList(_items); 

    (...) 
    } 
} 


class ItemClass implements Parcelable { 
    boolean _parcelableDownHeirarchy = true; 
    ContainerClass _containerRef;  
    (...) 

    private ItemClass(Parcel in) { 
    if (!_parcelableDownHeirarchy) { 
     _containerRef = in.readParcelable(ContainerClass.class.getClassLoader()); 
     //Won't contain item in it's _items list.   
    } 
    } 

    public void writeToParcel(Parcel p, int args) { 
    p.writeByte((byte)_parcelableDownHierarchy ? 1 : 0); 
    if (!_parcelableDownHeirarchy) //Up the heirarchy 
     p.writeParcelable(_containerRef); 

    (...) 
    }  
} 

2) hackish वैकल्पिक हल, एक स्थिर हैश तालिका को रोजगार, दी गई प्रत्येक वस्तु के विशिष्ट पहचान की जा सकती है, यह parcelable गुण है द्वारा। (मेरे मामले में मेरे पास ऑब्जेक्ट्स में मेरे डेटाबेस में प्राथमिक कुंजी है)।

class ContainerClass implements Parcelable { 
    //Leave be 
} 


class ItemClass implements Parcelable { 
    HaspMap<Long, ContainerClass> _parents = new HashMap<Long, ContainerClass>(); 
    ContainerClass _containerRef;  
    (...) 

    public long get_PKhash() { /* Return unique identifier */ } 

    private ItemClass(Parcel in) { 
    (...) 
    assertTrue((_containerRef = _parents.remove(get_PKhash())) != null); 
    } 

    public void writeToParcel(Parcel p, int args) { 
    (...)//Don't write _containerRef 
    _parents.put(this.get_PKhash, _containerRef); 
    }  
} 
+0

मैंने नंबर 2 को कार्यान्वित किया। – Skod

8

यह अनिवार्य रूप से पाश होगा और ढेर अतिप्रवाह।

AFAIK, पार्सलिंग प्रक्रिया circular object graphs को संभाल नहीं पाती है। मैंने अभी an issue to get this better documented दायर किया है।

एक वर्कअराउंड p.writeParcelable(_containerRef); नहीं करना है। इसके बजाय, में, अपने ContainerClass(Parcel in) कन्स्ट्रक्टर (या फिर आपके CREATOR इसे संभालने में है) में, _items सूची में पढ़ने के बाद, उस सूची में पुन: प्रयास करें और प्रत्येक बच्चे को अपने माता-पिता के बारे में बताएं।

+0

अगर मैं कंटेनर क्लास के माध्यम से काम करता हूं तो यह कामकाज बहुत अच्छा होगा। दुर्भाग्य से यह आइटम क्लास उदाहरणों का एक संग्रह है जिसे मुझे किसी गतिविधि में पास करना है। जबकि मैं रिवर्स कर सकता था और p.writeList नहीं था क्योंकि मुझे वास्तव में मेरे प्रोग्राम के इस हिस्से में उस जानकारी की आवश्यकता नहीं है, यह कार्यान्वयन अन्य हिस्सों में समस्याओं का कारण बनता है जब "पर्ससेल" कंटेनर क्लास उदाहरणों में _items नहीं होंगे। – Skod

+0

यह समाधान मेरे लिए काम करता है। – kdroider

संबंधित मुद्दे