2012-07-01 11 views
7

ClassCastException se produce al azar para restaurar Vector en onRestoreInstanceState(). Generalmente, el vector de restauración está bien acabado, pero a veces se produce una excepción.ClassCastException se produce en onRestoreInstanceState

Creo que sucede cuando la actividad se va al fondo y se destruye, pero no estoy seguro.

¿Alguna idea? Gracias.

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); 
} 

añadido:

olvidé de adjuntar registro de excepciones. Es decir

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

Sugiero que reescriba su método 'onRestoreInstanceState' como sigue:' Object saved = savedInstanceState.getSerializable ("locationInfos"); if (instancia de Stack guardada) {mLocationInfoVector = (Stack ) guardada; } else if (saved! = null) {Log.e ("RestoreBug", "clase de objeto restaurado:" + saved.getClass(). getName()); } 'Entonces, al menos, puedes ver lo que estás recuperando. (Perdón por publicar el código en un comentario; no quiero publicar esto como respuesta). –

+0

Pensé de esa manera, pero realmente quiero saber qué mecanismo hace este caso. Agregué el registro de excepción y no sé por qué el tipo de objeto se cambia a ArrayList. – chris

+0

¿Por casualidad su superclase de actividad invalida 'onSaveInstanceState'? Me pregunto si está usando la tecla '" locationInfos "' en cualquier otro lugar de su código. (P.S. en cualquier caso, debe reorganizar su código 'onRestoreInstanceState' para que solo llame a' getSerializable() 'una vez.) –

Respuesta

5

utilizo siguiente código para restaurar vectorial:

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

Previene java.lang.ClassCastException y guarda para los elementos.

Para restaurar la pila, puede utilizar código siguiente:

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

Funciona debido al vector, Montón, ArrayList se extiende Collection, y se puede emitir su objeto serializado a la colección y pasar para el apilado o Vector addAll() método.

+0

chico, eso está mal. Gracias. –

4

Esto suele ocurrir cuando la actividad se ha destruido a causa de la presión de memoria. El paquete pasado a onRestoreInstanceState parece retener una instancia de la clase base (ArrayList en este caso).

Es posible que pueda reproducir el problema mediante la deformación de las opciones de desarrollador:

  1. vaya a Configuración | Opciones de desarrollo
  2. Active la casilla de "No mantener actividades"

Ahora su actividad serán destruidos inmediatamente después de salir de ella. Al iniciar la actividad en cuestión, al presionar el botón Inicio y luego al volver a su aplicación, se debe activar ClassCastException.

Mientras tanto, la sugerencia de Ted Hopp utilizar

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

debe evitar chocar la aplicación.

+0

Todavía no sé el mecanismo que guarda el valor existe en el paquete, pero el tipo se cambia. – chris

Cuestiones relacionadas