Gli array hanno un comportamento polimorfico - non sono presenti solo tipi generici.
Cioè, se Uri
implementa Parcelable
poi
si può dire:
Parcelable[] pa = new Uri[size];
Uri[] ua = (Uri[]) pa;
non si può dire:
List<Parcelable> pl = new ArrayList<Uri>();
Come vedete siamo in grado di lanciare pa
torna a Uri[]
. Allora qual è il problema? Questo ClassCastException
si verifica quando l'app viene uccisa e successivamente viene ricreato l'array salvato. Quando viene ricreato, il runtime non sa che tipo di array (Uri[]
) è stato creato, quindi crea solo un Parcelable[]
e inserisce elementi in esso. Da qui il ClassCastException
quando provi a lanciarlo su Uri[]
.
Si noti che l'eccezione non si verifica (in teoria) quando il processo non viene ucciso e l'array originariamente creato (Uri[]
) viene riutilizzato tra cicli di salvataggio/ripristino di stato. Come quando cambi l'orientamento.
Volevo solo chiarire PERCHE 'è successo. Se vuoi una soluzione, @solo ha fornito una soluzione decente.
Cheers
fonte
2013-11-19 13:52:57
Inviare lo stacktrace. –
L'elemento 'Uri' viene ereditato da' Parcelable' o viceversa? – fge
Uri implements Parcelable –