NotSerializableException beim Drücken der Home-Taste

7

Ich habe eine Activity , in der ich eine private Klasse Data habe. In der Methode onSaveInstanceState versuche ich, eine Instanz von Data zu speichern. Das ist meine ganze Aktivität:

%Vor%

Wenn ich jetzt die Ausrichtung des Geräts ändere, wird das Data -Objekt gespeichert und wie es sollte gelesen. Wenn ich jedoch die Home-Taste drücke, stürzt die App mit folgendem in der Logcat ab:

  

05-10 20: 05: 51.895: E / AndroidRuntime (30317): FATALE AUSNAHME: Haupt   05-10 20: 05: 51.895: E / AndroidRuntime (30317):   java.lang.RuntimeException: Parcelable hat IOException-Schreiben festgestellt   serialisierbares Objekt (name = com.rigidbits.test.TestActivity $ Data)   05-10 20: 05: 51.895: E / AndroidRuntime (30317): um   android.os.Parcel.writeSerializable (Parcel.java:1176) 05-10   20: 05: 51.895: E / AndroidRuntime (30317): um   android.os.Parcel.writeValue (Parcel.java:1130) 05-10 20: 05: 51.895:   E / AndroidRuntime (30317): um   android.os.Parcel.writeMapInternal (Parcel.java:488) 05-10   20: 05: 51.895: E / AndroidRuntime (30317): um   android.os.Bundle.writeToParcel (Bundle.java:1552) 05-10 20: 05: 51.895:   E / AndroidRuntime (30317): um   android.os.Parcel.writeBundle (Paket.java:502) 05-10 20: 05: 51.895:   E / AndroidRuntime (30317): um   android.app.ActivityManagerProxy.activityPaused (ActivityManagerNative.java:1615)   05-10 20: 05: 51.895: E / AndroidRuntime (30317): um   android.app.ActivityThread.handlePauseActivity (ActivityThread.java:2298)   05-10 20: 05: 51.895: E / AndroidRuntime (30317): um   android.app.ActivityThread.access $ 1700 (ActivityThread.java:117) 05-10   20: 05: 51.895: E / AndroidRuntime (30317): um   android.app.ActivityThread $ H.handleMessage (ActivityThread.java:938)   05-10 20: 05: 51.895: E / AndroidRuntime (30317): um   android.os.Handler.dispatchMessage (Handler.java:99) 05-10   20: 05: 51.895: E / AndroidRuntime (30317): um   android.os.Looper.loop (Looper.java:130) 05-10 20: 05: 51.895:   E / AndroidRuntime (30317): um   android.app.ActivityThread.main (ActivityThread.java:3683) 05-10   20: 05: 51.895: E / AndroidRuntime (30317): um   java.lang.reflect.Method.invokeNative (Native Methode) 05-10   20: 05: 51.895: E / AndroidRuntime (30317): um   java.lang.reflect.Method.invoke (Methode.java:507) 05-10 20: 05: 51.895:   E / AndroidRuntime (30317): um   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:862)   05-10 20: 05: 51.895: E / AndroidRuntime (30317): um   com.android.internal.os.ZygoteInit.main (ZygoteInit.java:620) 05-10   20: 05: 51.895: E / AndroidRuntime (30317): um   dalvik.system.NativeStart.main (Native Methode) 05-10 20: 05: 51.895:   E / AndroidRuntime (30317): Verursacht von: java.io.NotSerializableException:   com.rigidbits.test.TestActivity 05-10 20: 05: 51.895:   E / AndroidRuntime (30317): um   java.io.ObjectOutputStream.writeNewObject (ObjectOutputStream.java:1535)   05-10 20: 05: 51.895: E / AndroidRuntime (30317): um   java.io.ObjectOutputStream.writeObjectInternal (ObjectOutputStream.java:1847)   05-10 20: 05: 51.895: E / AndroidRuntime (30317): um   java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1689)   05-10 20: 05: 51.895: E / AndroidRuntime (30317): um   java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1653)   05-10 20: 05: 51.895: E / AndroidRuntime (30317): um   java.io.ObjectOutputStream.writeFieldValues ​​(ObjectOutputStream.java:1143)   05-10 20: 05: 51.895: E / AndroidRuntime (30317): um   java.io.ObjectOutputStream.defaultWriteObject (ObjectOutputStream.java:413)   05-10 20: 05: 51.895: E / AndroidRuntime (30317): um   java.io.ObjectOutputStream.writeHierarchy (ObjectOutputStream.java:1241)   05-10 20: 05: 51.895: E / AndroidRuntime (30317): um   java.io.ObjectOutputStream.writeNewObject (ObjectOutputStream.java:1575)   05-10 20: 05: 51.895: E / AndroidRuntime (30317): um   java.io.ObjectOutputStream.writeObjectInternal (ObjectOutputStream.java:1847)   05-10 20: 05: 51.895: E / AndroidRuntime (30317): um   java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1689)   05-10 20: 05: 51.895: E / AndroidRuntime (30317): um   java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1653)   05-10 20: 05: 51.895: E / AndroidRuntime (30317): um   android.os.Parcel.writeSerializable (Parcel.java:1171) 05-10   20: 05: 51.895: E / AndroidRuntime (30317): ... 16 mehr

Wenn ich die Zeile in der onSaveInstanceState -Methode kommentiere, damit das Data -Objekt nicht gespeichert wird, verschwindet die App korrekt.

Irgendwelche Hilfe dabei?

    
nhaarman 10.05.2012, 14:20
quelle

1 Antwort

21

Ok, ich glaube, das Problem ist, dass Sie eine private innere Klasse verwenden.

Daher hat es Zugriff auf die Methoden und Felder Ihrer äußeren Klasse , d. h. Ihre Aktivität.

Da Ihre Aktivität nicht serialisierbar ist ( und daher nicht ), erhalten Sie Ihre Ausnahme.

  

Eine Instanz von InnerClass kann nur innerhalb einer Instanz von OuterClass existieren und hat direkten Zugriff auf die Methoden und Felder ihrer einschließenden Instanz.

Es gibt zwei Lösungen.

  • Machen Sie Ihre innere Klasse statisch

  • Verschieben Sie Ihre innere Klasse in eine eigene Klasse und deklarieren Sie sie als public

Diese Lösungen machen Ihre Klasse Data zu einer eigenständigen Klasse, und dann muss Ihre Aktivitätsinstanz nicht existieren

Referenz: Zypern

    
Blundell 10.05.2012, 19:10
quelle

Tags und Links