Frage an android – NotSerializableException beim Drücken der Home-Taste

9

ich habe einActivity in der ich eine private klasse habe daten. In demonSaveInstanceState Methode, versuche ich, dies eine Instanz von zu speichernData. Das ist meine ganze Tätigkeit:

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

Wenn ich jetzt die Ausrichtung des Geräts ändere, wird dieData Objekt wird gespeichert und wie es sollte gelesen. Wenn ich jedoch die Home-Taste drücke, stürzt die App im Logcat wie folgt ab:

05-10 20: 05: 51.895: E / AndroidRuntime (30317): FATAL EXCEPTION: main 05-10 20: 05: 51.895: E / AndroidRuntime (30317): java.lang.RuntimeException: Parcelable hat IOException beim Schreiben eines serialisierbaren Objekts (Name) festgestellt = com.rigidbits.test.TestActivity $ Data) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at android.os.Parcel.writeSerializable (Parcel.java:1176) 05-10 20: 05: 51.895 : E / AndroidRuntime (30317): at android.os.Parcel.writeValue (Parcel.java:1130) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at android.os.Parcel.writeMapInternal (Parcel. java: 488) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at android.os.Bundle.writeToParcel (Bundle.java:1552) 05-10 20: 05: 51.895: E / AndroidRuntime (30317) : at android.os.Parcel.writeBundle (Parcel.java:502) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at android.app.ActivityManagerProxy.activityPaused (ActivityManagerNative.java:1615) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at android.app.ActivityThread.handlePauseActivity (ActivityThread.java:2298) 05-10 20:05 : 51.895: E / AndroidRuntime (30317): at android.app.ActivityThread.access $ 1700 (ActivityThread.java:117) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at android.app.ActivityThread $ H .handleMessage (ActivityThread.java:938) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at android.os.Handler.dispatchMessage (Handler.java:99) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at android.os.Looper.loop (Looper.java:130) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at android.app.ActivityThread.main (ActivityThread.java: 3683) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at java.lang.reflect.Method.invokeNative (native Methode) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at java .lang.reflect.Method.invoke (Method.java:507) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java: 862) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:620) 05-10 20: 05: 51.895: E / AndroidRuntime ( 30317): in Dalvik .system.NativeStart.main (native Methode) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): Auslöser: java.io.NotSerializableException: com.rigidbits.test.TestActivity 05-10 20: 05: 51.895 : E / AndroidRuntime (30317): at java.io.ObjectOutputStream.writeNewObject (ObjectOutputStream.java:1535) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at java.io.ObjectOutputStream.writeObjectInternal (ObjectOutputStreamO. java: 1847) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1689) 05-10 20: 05: 51.895: E / AndroidRuntime (30317) : at java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1653) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at java.io.ObjectOutputStream.writeFieldValues ​​(ObjectOutputStream.java:1143) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at java.io.ObjectOutputStream.defaultWriteObject (ObjectOutputStream.java:413) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at java.io.ObjectOutputStream .writeHierarchy (ObjectOutputStream.java: 1241) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at 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): at java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1689) 05-10 20: 05: 51.895: E / AndroidRuntime (30317): at 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 weitere

Wenn ich die Zeile im KommentaronSaveInstanceState Methode so dasData Objekt istnicht gespeichert, verschwindet die App korrekt.

Hilfe dabei?

Ich habe es versucht, aber kein Glück. Die UID ist ein von Eclipse generierter Wert. nhaarman
nur aus Interesse machen Sie Ihre UID1L anstelle einer negativen Zahl Blundell

Deine Antwort

1   die antwort
22

private innere Klasse.

Deshalb hat esZugriff auf die Methoden und Felder Ihrer äußeren Klasse d.h. Ihre Aktivität.

Da Ihre Aktivität nicht serialisierbar ist (und so sollte es nicht sein), bekommen Sie Ihre Ausnahme.

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

Es gibt zwei Lösungen.

Mach deine innere Klasse statisch

Verwandle deine innere Klasse in eine eigene Klasse und erkläre sie für öffentlich

Diese beiden Lösungen machen IhreData Klasse eine Klasse für sich und dann muss Ihre Aktivitätsinstanz nicht existieren

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

Wow, sehr klare Antwort, und es funktioniert! Danke vielmals! Ich habe es zu einer statischen Klasse gemacht, weil ich eine ganze Reihe von Aktivitäten habe, die eine Data-Klasse benötigen, und es hat für jede einzelne eindeutige Felder. nhaarman

Verwandte Fragen