Pregunta sobre android – NotSerializableException al presionar el botón de inicio

9

Yo tengo unActivity en el que tengo una clase privada de datos. En elonSaveInstanceState Método, trato de guardar esto una instancia deData. Esta es toda mi actividad:

<code>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;

    }
}
</code>

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

05-10 20: 05: 51.895: E / AndroidRuntime (30317): EXCEPCIÓN FATAL: principal 05-10 20: 05: 51.895: E / AndroidRuntime (30317): java.lang.RuntimeException: Objeto serializable IOException encontrado (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 (Parcel. 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 / Android Runtime (30317): at 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 / Android Runtime ( 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): at java.io.ObjectOutputStream.writeObjectInAL 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 / Android Runtime (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:1111 05/05) 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 / Android Runtime (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-05 05: 51.895: E / AndroidRuntime (30317): en java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1653) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at android.os.Parcel.writeSerializable (Parcel.java:1171) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): ... 16 más

Cuando comento la línea en elonSaveInstanceState método para elData objeto esno Guardada, la aplicación desaparece correctamente.

¿Alguna ayuda con esto?

Lo he intentado, pero no tengo suerte. El UID es un valor generado por Eclipse. nhaarman
solo por interes hacer tu UID1L en lugar de un número negativo Blundell

Tu respuesta

1   la respuesta
22

Ok, creo que el problema es que estás usando unclase interna privada.

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

Porque tu actividad no es serializable (y así no debería ser), está recibiendo su excepción.

Una instancia de InnerClass puede existir solo dentro de una instancia de OuterClass y tiene acceso directo a los métodos y campos de su instancia adjunta.

Hay dos soluciones.

Haz tu clase interna estática

Mueve tu clase interna para que sea una clase propia y declarala pública

Estas soluciones hacen que suData clase una clase en su propio derecho y entonces no necesita su instancia de actividad para existir

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

Wow, respuesta muy clara, y funciona! ¡Muchas gracias! La he convertido en una clase estática, porque tengo muchas actividades que necesitan una clase de datos y tiene campos únicos para cada una de ellas. nhaarman

Preguntas relacionadas