ClassCastException si verifica in modo casuale per ripristinare Vector in onRestoreInstanceState(). Generalmente il ripristino del vettore è terminato correttamente, ma a volte si verifica un'eccezione.ClassCastException si verifica in onRestoreInstanceState
Penso che succeda quando l'attività è passata allo sfondo e distrutta ma non ne sono sicuro.
Qualche idea? Grazie.
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);
}
aggiunto:
Ho dimenticato di allegare log eccezione. Cioè
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Stack
Suggerisco di riscrivere il metodo 'onRestoreInstanceState' come segue:' Oggetto salvato = savedInstanceState.getSerializable ("locationInfos"); if (saved instanceof Stack) {mLocationInfoVector = (Stack) salvato; } else if (saved! = null) {Log.e ("RestoreBug", "Classe oggetto ripristinato:" + saved.getClass(). getName()); } 'Quindi puoi almeno vedere cosa stai tornando. (Ci scusiamo per aver postato il codice in un commento, non voglio postare questo come risposta). –
Ho pensato in questo modo, ma voglio davvero sapere quale meccanismo rende questo caso. Ho aggiunto il registro delle eccezioni e non so perché il tipo di oggetto sia cambiato in ArrayList. – chris
Per caso la superclasse della tua attività sovrascrive 'onSaveInstanceState'? Mi chiedo se stai usando la chiave "locationInfos" in qualsiasi altra parte del tuo codice. (P.S. in ogni caso, dovresti riorganizzare il tuo codice 'onRestoreInstanceState' in modo che chiami solo' getSerializable() 'una volta.) –