2012-07-01 9 views
7

क्लासकास्ट एक्सेप्शन ऑनरस्टोरस्टेशनस्टेट() में वेक्टर को पुनर्स्थापित करने के लिए यादृच्छिक रूप से होता है। आम तौर पर वेक्टर को बहाल करना ठीक हो गया है, लेकिन कभी-कभी अपवाद होता है।ClassCastException ऑनस्टोर इंस्टेंसस्टेट

मैं इसे तब होता है जब गतिविधि पृष्ठभूमि के पास गया और नष्ट हो जाता है लगता है, लेकिन मुझे यकीन है कि नहीं हूँ।

कोई भी विचार? धन्यवाद।

Stack<LocationInfo> mLocationInfoVector; 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    outState.putSerializable("locationInfos", mLocationInfoVector); 

    super.onSaveInstanceState(outState); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    if (savedInstanceState.getSerializable("locationInfos") != null) { 
     @SuppressWarnings("unchecked") 
     mLocationInfoVector= (Stack<LocationInfo>) savedInstanceState.getSerializable("locationInfos"); 
    } 

    super.onRestoreInstanceState(savedInstanceState); 
} 

जोड़ा:

मैं अपवाद लॉग संलग्न करने के लिए भूल गया था। कि

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Stack 
+1

मेरा सुझाव है कि आप अपनी 'onRestoreInstanceState' विधि को निम्नानुसार लिखते हैं:' ऑब्जेक्ट सेव किया गया = savedInstanceState.getSerializable ("locationInfos"); अगर (स्टैक सहेजा गया उदाहरण) {mLocationInfoVector = (स्टैक ) सहेजा गया; } और अगर (सहेजा गया! = शून्य) {Log.e ("RestoreBug", "पुनर्स्थापित ऑब्जेक्ट क्लास:" + saved.getClass()। getName()); } 'फिर आप कम से कम देख सकते हैं कि आप क्या प्राप्त कर रहे हैं। (एक टिप्पणी में कोड पोस्ट करने के लिए खेद है; मैं इसे एक उत्तर के रूप में पोस्ट नहीं करना चाहता)। –

+0

मैंने इस तरह सोचा, लेकिन मैं वास्तव में जानना चाहता हूं कि इस मामले में कौन सी तंत्र है। मैंने अपवाद लॉग जोड़ा और मुझे नहीं पता कि ऑब्जेक्ट प्रकार ArrayList में क्यों बदला जाता है। – chris

+0

किसी भी मौके से आपकी गतिविधि superclass 'SSaveInstanceState' ओवरराइड करता है? मैं सोच रहा हूं कि क्या आप अपने कोड में कहीं और 'स्थान इन्फोस' 'कुंजी का उपयोग कर रहे हैं। (किसी भी घटना में पी एस, तुम इतना है कि यह केवल कॉल अपने 'onRestoreInstanceState' कोड पुनर्निर्माण चाहिए' getSerializable() 'एक बार।) –

उत्तर

5

मैं वेक्टर बहाल करने के लिए अगले कोड का उपयोग करें।

ढेर पुनर्स्थापित करने के लिए, आप अगले कोड का उपयोग कर सकते हैं:

stack = new Stack<Object>(); 
stack.addAll((Collection<Object>) state.getSerializable(EXTRA_STACK)); 

यह काम करता है वेक्टर, ढेर, ArrayList के कारण संग्रह बढ़ा रहे हैं, और आप संग्रह करने के लिए अपने धारावाहिक वस्तु डाल सकता और स्टैक या वेक्टर addAll को पारित() तरीका।

+0

लड़का, यह गड़बड़ है। धन्यवाद। –

4

यह आमतौर पर जब गतिविधि स्मृति दबाव के कारण नष्ट कर दिया गया होता है। रेस्टोर इंस्टेंसस्टेट पर पारित बंडल बेस क्लास (ArrayList इस मामले में) का एक उदाहरण बनाए रखने लगता है।

आप डेवलपर विकल्प अदल-बदल करके इस मुद्दे को पुन: पेश करने में सक्षम हो सकता है:

  1. जाओ सेटिंग पर | डेवलपर विकल्प
  2. चेक "गतिविधियों को न रखें"

अब अपनी गतिविधि नष्ट हो जाएगा आप इसे छोड़ के तुरंत बाद के लिए बॉक्स। प्रश्न में गतिविधि लॉन्च करना, होम बटन दबाकर, और फिर अपने ऐप पर वापस स्विच करना ClassCastException को ट्रिगर करना चाहिए।

इस बीच में, टेड हॉप के सुझाव

if (saved instanceof Stack) { 
    .... 
} 

उपयोग करने देता है दुर्घटनाग्रस्त होने से बचने चाहिए।

objects = new Vector<Object>((Collection<Object>) state.getSerializable(EXTRA_OBJECTS)); 

यह java.lang.ClassCastException से बचाता है और तत्वों क्रम सहेजता है:

+0

मुझे अभी भी उस तंत्र को नहीं पता है जो बंडल में मौजूद मूल्य बचा है, लेकिन प्रकार बदल गया है। – chris

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