NotSerializableException al presionar el botón de inicio

Tengo una Activity en la que tengo una clase privada Datos. En el método onSaveInstanceState , intento guardar esta una instancia de Data . Esta es mi Actividad:

 public class TestActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public void onSaveInstanceState(Bundle outState){ outState.putSerializable("TEST", new Data()); } private class Data implements Serializable { private static final long serialVersionUID = -4312723541994925110L; } } 

Ahora, cuando cambio la orientación del dispositivo, el objeto Data se guarda y se lee como debería. Sin embargo, cuando presiono el botón de inicio, la aplicación se bloquea con lo siguiente en el registro:

05-10 20: 05: 51.895: E / AndroidRuntime (30317): Java.lang.RuntimeException: Parcelable encontrado IOException que escribe un objeto serializable (nombre = Com.rigidbits.test.TestActivity $ Data) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.os.Parcel.writeSerializable (Parcel.java:1176) 05-10 20: 05: 51.895 : E / AndroidRuntime (30317): en android.os.Parcel.writeValue (Parcel.java:1130) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.os.Parcel.writeMapInternal (Paquete. Java: 488) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.os.Bundle.writeToParcel (Bundle.java:1552) 05-10 20: 05: 51.895: E / AndroidRuntime (30317) : En android.os.Parcel.writeBundle (Parcel.java:502) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.app.ActivityManagerProxy.activityPaused (ActivityManagerNative.java:1615) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.app.ActivityThread.handlePauseActivity (ActivityThread.java:2298) 05-10 20:05 : 51.895: E / AndroidRuntime (30317): en android.app.ActivityThread.access $ 1700 (ActivityThread.java:117) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.app.ActivityThread $ H .handleMessage (ActivityThread.java:938) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.os.Handler.dispatchMessage (Handler.java:99) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.os.Looper.loop (Looper.java:130) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.app.ActivityThread.main (ActivityThread.java: 3683) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java.lang.reflect.Method.invokeNative (Método nativo) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java .lang.reflect.Method.invoke (Method.java:507) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java: 862) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en com.android.internal.os.ZygoteInit.main (ZygoteInit.java:620) 05-10 20: 05: 51.895: E / AndroidRuntime 30317): en dalvik .system.NativeStart.main (Método nativo) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): Causado por: java.io.NotSerializableException: com.rigidbits.test.TestActivity 05-10 20: 05: 51.895 : E / AndroidRuntime (30317): en java.io.ObjectOutputStream.writeNewObject (ObjectOutputStream.java:1535) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java.io.ObjectOutputStream.writeObjectInternal (ObjectOutputStream. Java: 1847) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1689) 05-10 20: 05: 51.895: E / AndroidRuntime (30317) : En java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1653) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java.io.ObjectOutputStream.writeFieldValues ​​(ObjectOutputStream.java:1143) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java.io.ObjectOutputStream.defaultWriteObject (ObjectOutputStream.java:413) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java.io.ObjectOutputStream .writeHierarchy (ObjectOutputStream.java: 1241) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java.io.ObjectOutputStream.writeNewObject (ObjectOutputStream.java:1575) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at Java.io.ObjectOutputStream.writeObjectInternal (ObjectOutputStream.java:1847) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1689) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1653) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): en android.os.Parcel.writeSerializable (Parcel.java:1171) 05-10 20: 05: 51.895: E / AndroidRuntime (30.317): … 16 más

Cuando comento la línea en el método onSaveInstanceState para que el objeto Data no se guarde, la aplicación desaparece correctamente.

¿Alguna ayuda con esto?

Ok, creo que el problema es que está utilizando una clase privada interna .

Por lo tanto, tiene acceso a los métodos y campos de su clase externa, es decir, su actividad.

Debido a que su actividad no es serializble ( y por lo que no debe ser ), su obtener su excepción.

Una instancia de InnerClass sólo puede existir dentro de una instancia de OuterClass y tiene acceso directo a los métodos y campos de su instancia de inclusión.

Introduzca aquí la descripción de la imagen

Hay dos soluciones.

  • Haga su clase interna estática

  • Mover a su clase interna para ser una clase propia y declararla pública

Estas soluciones hacen que su clase Data una clase por derecho propio y luego no necesita que su instancia de actividad exista

Referencia: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.