2012-06-10 9 views
7

Recibo la siguiente excepción con mi aplicación. Creo que esto sucede cuando el usuario abandona la aplicación por un tiempo prolongado y luego vuelve a ella. No puedo replicarlo, pero aparece mucho en mis registros de bloqueo. No tengo idea de por qué sucede esto, por lo que cualquier sugerencia es muy apreciada.Excepción de estado guardado

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/com.myapp.MyActivity}: java.lang.ArrayIndexOutOfBoundsException: length=3; index=-1 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2202) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2237) 
at android.app.ActivityThread.access$600(ActivityThread.java:139) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:4974) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=3; index=-1 
at java.util.ArrayList.get(ArrayList.java:306) 
at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1764) 
at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:198) 
at com.myapp.MyActivity.onCreate(MyActivity.java:235) 
at android.app.Activity.performCreate(Activity.java:4538) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2158) 
... 11 more 

Línea 235 es el siguiente:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); // line 235 

Mi onSaveInstanceState() es bastante simple:

@Override 
public void onSaveInstanceState(Bundle state) { 
    super.onSaveInstanceState(state); 

    state.putInt("id1", id1); 
    state.putInt("id2", id2); 
    state.putInt("id3", id3); 
    state.putInt("id4", id4); 

} 
+0

es porque uno de ID1, ID2, ID3, ID4 equivale a -1 cuando lo estás guardando? – Blundell

+0

Nunca deberían ser -1, sin embargo, no creo en el valor de las materias. – Nick

+0

¿Estás seguro de que la línea 235 es esa línea? La compilación de la que obtuviste el Log es la misma que estás revisando? – Blundell

Respuesta

4

me encontré con este mismo problema, creo que es un error por el androide. Echar un vistazo a este hilo para una posible solución http://code.google.com/p/android/issues/detail?id=22404

+0

No estoy seguro de si este es exactamente el mismo error. Los números de línea están apagados. Por supuesto, esa podría ser una versión diferente de la biblioteca de soporte con el mismo error ... o podría ser un error diferente. – P1r4nh4

2

que tiene exactamente el mismo problema, he seguido los consejos dados en enlace de Kenny:

que utilizó la siguiente:

FragmentManager.enableDebugLogging(true); 

Esto mostrará en los registros todas las llamadas en el FragmentManager (fragmentos añadidos, eliminados, ocultos, etc.).

Me permitió ver lo que estaba mal en mi caso, uno de los fragmentos en mi aplicación fue a veces no guardan correctamente en la instancia y su contenido fue nula.

Entonces ocurrió el accidente con el mismo registro de errores cuando la aplicación trató de restaurar este fragmento nula desde la instancia.

En mi caso este fragmento era un poco especial y crea automáticamente. Para asegurarse de no volver a obtener el error, eliminé el fragmento del FragmentManager antes de salir del Activity.

+2

Upvote para 'FragmentManager.enableDebugLogging (true)' – Robert

0

que tenían el mismo problema, que se producen con los cambios de orientación, pero sólo ocurrió con las versiones anteriores de Android (4.0.4), las nuevas versiones 4.4.2 como estaban bien. Quiero compartir con ustedes cómo lo arreglé.

como se sugiere Kenny y Yoann, solía

FragmentManager.enableDebugLogging(true); 

, y se informó que el exceso de eliminación se ha hecho. Tuve que eliminar ft.remove(df) de mi código y ahora está bien con las dos versiones mencionadas anteriormente. Este es mi código:

if (savedInstanceState != null) { 
    final FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    final DialogFragment df = (DialogFragment) getFragmentManager().findFragmentByTag("tag"); 
    if (df != null) { 
     df.dismiss(); 
     // ft.remove(df); 
     frag = new MyDialogFragment(); 
     frag.show(getFragmentManager(), "tag"); 
    } 
    ft.addToBackStack(null); 
    ft.commit(); 
} 

En aras de la exhaustividad, esto es lo que he hecho en onSaveInstanceState(final Bundle outstate):

if (frag != null) { 
    getFragmentManager().putFragment(outState, "tag", frag); 
} 
Cuestiones relacionadas