2011-03-09 14 views
5

सेटअपClassNotFoundException शुरू

मैं एक गतिविधि है कि केवल OnCreate(), onResume (ओवरराइड करता है) है, और onSaveInstanceState()।

@Override 
    public void onSaveInstanceState(Bundle state) { 
     super.onSaveInstanceState(state); 
     state.putSerializable("obj", myObj); // myObj is of class MyClass    state.putLong("long", longVar); 
    } 

MyClass मूल रूप से गतिविधि वर्ग के भीतर एक आंतरिक वर्ग था, लेकिन डिबगिंग के लिए, मैं भी यह एक अलग फाइल में ले जाया गया:

public class MyClass implements Serializable { 
    private static final long serialVersionUID = 0x98ED2F00; 
    .... 
} 

onSaveInstanceState() में, मैं एक serializable वस्तु में डाल कदम:

  1. हमेशा की तरह कार्यक्रम शुरू करें, यह ठीक चलाता है।
  2. लॉन्चर पर वापस जाने के लिए होम बटन पर क्लिक करें।

    java.lang.RuntimeException: गतिविधि ComponentInfo प्रारंभ करने में अक्षम {com.example

  3. ग्रहण से, प्रक्रिया डिवाइस पैनल
  4. प्रारंभ कार्यक्रम से फिर से लांचर से, इस समय मैं निम्नलिखित रोक .Reports}: java.lang.RuntimeException Parcelable ClassNotFoundException एक serializable वस्तु को पढ़ने का सामना करना पड़ा {नाम = com.example.MyClass}

    की वजह से: java.lang.ClassNotFoundException: लोडर dalvik.System.PathClassLoader में com.examp.MyClass [।]

सुराग और टिप्पणियों:

  1. सबसे महत्वपूर्ण सुराग है: अगर मैं onSaveInstanceState में myObj नहीं सहेजते हैं(), तो सब कुछ ठीक है। और, किसी भी आदिम प्रकार को बंडल में डालना ठीक है, लेकिन मेरी वस्तुओं नहीं।

  2. अपवाद मेरी कोड के बाहर फेंक दिया जाता है, यह OnCreate() और onResume के बीच हुआ()। यह एंड्रॉइड के अंदर हुआ।

  3. त्रुटि संदेश में वर्ग के नाम सही है: com.example.MyClass। मूल रूप से यह गतिविधि के अंदर एक आंतरिक वर्ग था, लेकिन समस्या को अलग करने के लिए, मैंने इसे एक अलग फ़ाइल में ले जाया, इसका कोई फायदा नहीं हुआ।

  4. मेरा मानना ​​है कि Serializable के कार्यान्वयन सही है, क्योंकि यह कार्यक्रम के अन्य भागों में एक फ़ाइल से/धारावाहिक जा सकता है।

क्या किसी के पास इसके किसी भी संभावित कारण का कोई विचार है? बहुत सराहना की! (क्षमा करें, मैं यहां विस्तृत कोड नहीं डाल सकता, क्योंकि सबकुछ यहां और वहां पर केंद्रित है। मैं केवल उतना ही अलग कर सकता हूं।)

उत्तर

5

ठीक है, मुझे लगता है कि मुझे इस समस्या का समाधान मिला है।

यह पता चला कि यदि सहेजे गए इन्स्टेंसस्टेट पैरामीटर को क्रेट() में पास नहीं किया गया है, तो उस बंडल में निहित किसी भी ऑब्जेक्ट को deserialize करना चाहिए। मुझे नहीं पता क्यों, लेकिन इस तरह मैंने समस्या से छुटकारा पा लिया। मूल रूप से ऑनक्रेट() में मेरा कोड तर्क है कि कुछ स्थितियों में, मैं सहेजे गए इंस्टेंसस्टेट की अवहेलना करता हूं।अब जब तक यह शून्य नहीं है, तब तक मैं सबकुछ निराश कर दूंगा, फिर, अन्य स्थितियों के आधार पर, मैं तय करता हूं कि मैं उनका उपयोग करता हूं या नहीं।

अब तक यह ठीक चलाता है। लेकिन मुझे इस बारे में कोई जानकारी नहीं है:

  1. मुझे उन्हें निराश क्यों करना है, और यदि नहीं, तो अपवाद होता है?

  2. एंड्रॉयड मेरी बातें मैं savedInstanceState में डाल deserialize करने के लिए क्या कर रहा था? मेरा मतलब है, मैं समझता हूं कि एंड्रॉइड ने अपने इस्तेमाल के लिए कुछ जानकारी डाली हो, लेकिन यह क्यों आती है और मेरी चीजों को बेकार करने का प्रयास करती है? अगर यह जानता है कि यह नहीं जानता कि उन्हें कैसे उपयोग किया जाए?

+0

वापस आने और आपके समाधान की रिपोर्ट करने के लिए बहुत बहुत धन्यवाद। मैं कल्पना नहीं कर सकता कि इसे समझने में कितना समय लगेगा, यह बिल्कुल स्पष्ट नहीं है – HXCaine

1

मैं इस एक ही मुद्दा लड़ रहा है और जिस तरह से मैं हल करने समाप्त हो गया यह वर्ग मैं बंडल में stashing गया था में Parceable बजाय Serializable लागू करने के लिए किया गया था।

मैं एमुलेटर पर DevTools ऐप का उपयोग करके दुर्घटना को पुन: उत्पन्न करने में सक्षम था (वास्तविक डिवाइस पर काम नहीं करता) और Development Settings > Immediately destroy activities को चेक करने के लिए बदल रहा है। Parceable पर मेरी कस्टम क्लास को बदलना और putParcelable में बदलना onSaveInstanceState में समस्या को ठीक करना प्रतीत होता था।

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