2011-01-31 13 views
24

नहीं कहा जाता है, मैं यहां प्रश्न पोस्ट करने के लिए बिल्कुल नया हूं, हालांकि मैं यहां वर्षों से बहुत कुछ पढ़ रहा हूं। आम तौर पर मैं हमेशा वेब पर पूरी तरह से खोज करके अपने उत्तरों को ढूंढने में सक्षम हूं, लेकिन इस बार मुझे नुकसान हुआ है ...एंड्रॉइड: पार्ससेलबल .writeToParcel और Parcelable.Creator.createFromParcel को कभी भी

यह जानने का प्रयास करने के एक और दिन बिताए जाने के बाद कि यह क्यों काम नहीं कर रहा है मैंने पूछा मदद के लिए, उम्मीद है कि आप मुझे कुछ पॉइंटर्स, या बेहतर, एक समाधान दे सकते हैं।

समस्या: एक एंड्रॉइड गेम में मैं उस बिंदु पर आया हूं जहां मुझे एप्लिकेशन को अपने राज्य को याद रखना होगा जब उपयोगकर्ता होम-स्क्रीन बटन दबाता है। कुछ खोजों के बाद मुझे एहसास हुआ कि आवेदन को दोबारा खोलने के बाद मेरी कक्षाएं अपने उचित राज्यों में वापस शुरू करने के लिए मुझे बंडल के साथ पारित करने के लिए पार्ससेल इंटरफेस का समर्थन करना पड़ा।

मेरी onStop और onStart कार्यों मैं क्रमशः बचाने के लिए और करने के लिए और एक बंडल से खेल राज्य को बहाल में, हालांकि जब मैं बंडल वस्तु की writeToParcel और createFromParcel कार्यों कभी नहीं कहा जाता है पर putParcelable और getParcelable कार्यों कहते हैं।

यह सोचकर कि यह खेल की सापेक्ष जटिलता के कारण हो सकता है, मुझे लगा कि मैंने इसे काम करने की कोशिश करने के लिए सबसे आसान एप्लिकेशन बनाया था।

कई Parcelable उदाहरण मैं ऑनलाइन देखा है के आधार पर, यह मेरी कक्षा में बदल गया:

public class ParcelableTest implements Parcelable { 
    int id; 

    public ParcelableTest(int newID) 
    { 
    id = newID; 
    } 

    private ParcelableTest(Parcel in) { 
     readFromParcel(in); 
    } 

    public void writeToParcel(Parcel out, int arg1) { 
     writeToParcel(out); 
    } 

    public void writeToParcel(Parcel out) { 
    Log.v("ParcelableTest","Writing to parcel"); 
     out.writeInt(id); 
    } 

    public void readFromParcel(Parcel in) { 
     id = in.readInt(); 
    } 

    public int describeContents() { 
     return 0; 
    } 

    public static final Parcelable.Creator<ParcelableTest> CREATOR = new 
    Parcelable.Creator<ParcelableTest>() { 
     public ParcelableTest createFromParcel(Parcel in) { 
      Log.v("ParcelableTest","Creating from parcel"); 
       return new ParcelableTest(in); 
     } 

     public ParcelableTest[] newArray(int size) { 
       return new ParcelableTest[size]; 
     } 
    }; 
} 

और मेरे मुख्य गतिविधि से मैं बचाने/डेटा को पुनर्स्थापित करने के लिए निम्न कार्यों कहेंगे:

public Bundle saveToBundle(Bundle savedState) 
    { 
     savedState.putParcelable("Test1",mTest1); 
     savedState.putParcelable("Test2",mTest2); 
     return savedState; 
    } 
    public void restoreFromBundle(Bundle savedState) 
    { 
     mTest1 = savedState.getParcelable("Test1"); 
     mTest2 = savedState.getParcelable("Test2"); 

    } 

लेकिन किसी कारण से न तो कार्यों में से (पटरपेर्सेबल और getParcelable फ़ंक्शंस के साथ) के परिणामस्वरूप मेरी टेस्ट क्लास में उपयुक्त पार्सलबल कॉल होंगे।

अजीब बात यह है कि यह किसी भी तरह से सही मानों को पढ़ता है (मैंने कक्षा में अधिक चर के साथ प्रयास किया है), लेकिन मेरा डिबगिंग और मेरा लॉग दिखाता है कि था एप्लिकेशन को कभी भी लिखने के लिए नहीं मिलता है और पार्परसेल बनाएं।

मुझे यहां क्या याद आ रही है?

किसी भी मदद/विचारों की सराहना की जाएगी।

+0

अगर उत्तर आपके प्रश्न को हल किया गया है, तो क्या आप इसे चिह्नित करेंगे? या क्या आपको अपनी समस्या का बेहतर समाधान मिला? क्या आप इसे यहां पोस्ट करेंगे? – superjos

उत्तर

10

स्पष्ट रूप से एंड्रॉइड बंडल कक्षा पार्सल करने योग्य प्रोटोकॉल का पालन नहीं करती है, इसके बजाय आईपीसी मार्शलिंग के दौरान इसका पालन किया जाता है।

इसके बजाए, ऐसा लगता है कि बंडल कार्यान्वयन केवल लिखता है और पार्सलबल ऑब्जेक्ट को प्रतिबिंब के माध्यम से अपने आंतरिक मानचित्र में पढ़ता है। हमने परीक्षण किए एक परीक्षण से, ऐसा लगता है कि बंडल आपके पार्सलबल-व्युत्पन्न वर्ग में परिभाषित प्रत्येक फ़ील्ड को लिखता/पढ़ता है, सिर्फ इसलिए कि आपने उन फ़ील्ड को घोषित किया है।

+2

यह सही लगता है, जब गतिविधि नष्ट हो जाती है, जब पार्सल करने योग्य तरीकों को बुलाया जाता है। – newfivefour

+0

वही यहाँ। परिवर्तनीय के रूप में एक चर को चिह्नित करने में भी मदद नहीं करेगा। यह अभी भी serialized किया जाएगा। यह अप्रत्याशित व्यवहार है जो गंदा बग पेश करता है। क्या आप में से किसी ने इस बारे में चिंतित किया था? – MaiOM

+0

नहीं, हमने नहीं किया। वापस देखकर, शायद हमने सोचा कि यह कार्यान्वयन विवरण के लिए कुछ * बहुत करीब * था क्योंकि बंडल को सेवा देने के उद्देश्य से इसका विरोध किया गया था। मूल रूप से मैं @Luis लिखने के साथ सहमत हूं। – superjos

4

तकनीकी रूप से, दस्तावेज़ीकरण यह नहीं कहता कि writeToParcel या createFromParcelonSaveInstance से बुलाए जाते हैं। वास्तव में, यदि आप अपने कोड में savedState जांचते हैं तो आपको यह पता चल जाएगा कि यह सहेजने और पुनर्स्थापित मामलों दोनों में बिल्कुल वही ऑब्जेक्ट उदाहरण है; यदि आप कर सकते हैं तो serialize-deserialize से बचने के लिए यह समझ में आता है।
ओटीओएच, दस्तावेज़ीकरण यह नहीं कहता कि धारावाहिक नहीं किया गया है। निष्कर्ष यह होना चाहिए कि आपको किसी भी मामले पर निर्भर नहीं होना चाहिए, बस मान लें कि आपको सही बंडल मिलता है।

इसके अलावा, आप की जाँच करने के http://developer.android.com/guide/topics/resources/runtime-changes.html

0

मैं पुष्टि क्या superjos कहा कर सकते हैं। saveToBundle ईवेंट पर, एंड्रॉइड बंडल सिर्फ प्रतिबिंब के वर्ग के सदस्यों को प्रतिस्थापित करता है और पार्ससेलबल फ़ंक्शंस को कॉल नहीं करता है। मैं इस समस्या पर एक दिन खो गया है! उदास ....

यह वास्तव में बुरा है .... इसका मतलब है कि आप इस तरह से कुछ भी नहीं करने के लिए संभावित रूप से बड़ी मात्रा में डेटा स्टोर करते हैं।

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