2012-05-10 15 views
7

Ho un Activity in cui sono presenti dati di classe privata. Nel metodo onSaveInstanceState, provo a salvare questa istanza di Data. Questa è tutta la mia attività:NotSerializableException quando si preme il tasto home

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; 

    } 
} 

Ora quando cambio l'orientamento del dispositivo, l'oggetto Data viene salvata e letta come dovrebbe. Tuttavia, quando si preme il tasto home, l'applicazione si blocca con il seguente nel logcat:

05-10 20: 05: 51,895: E/AndroidRuntime (30317): eccezione irreversibile: principale 05-10 20 : 05: 51.895: E/AndroidRuntime (30317): java.lang.RuntimeException: Parcelable ha rilevato la scrittura IOException oggetto serializzabile (nome = com.rigidbits.test.TestActivity $ Data) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a android.os.Parcel.writeSerializable (Parcel.java:1176) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a android.os.Parcel.writeValue (pacchetto .java: 1130) 05-10 20: 05: 51.895: E/AndroidR untime (30317): a android.os.Parcel.writeMapInternal (Parcel.java:488) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a android.os.Bundle.writeToParcel (Pacchetto. java: 1552) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a android.os.Parcel.writeBundle (Parcel.java:502) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a android.app.ActivityManagerProxy.activityPaused (ActivityManagerNative.java:1615) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a android.app.ActivityThread.handlePauseActivity (ActivityThread.java : 2298) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a android.app.ActivityThread.access $ 1700 (ActivityThread.java:117) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a android.app.ActivityThread $ H.handleMessage (ActivityThread.java:938) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a android.os.Handler.dispatchMessage (Handler.java:99) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a android.os.Looper.loop (Looper.java:130) 05- 10 20: 05: 51.895: E/AndroidRuntime (30317): a android.app.ActivityThread.main (ActivityThread.java:3683) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a java.lang.reflect.Method.invokeNative (metodo nativo) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a java.lang.reflect.Method.invoke (Method.java:507) 05- 10 20: 05: 51.895: E/AndroidRuntime (30317): a com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:862) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a com .android.internal.os.ZygoteInit.main (ZygoteInit.java:620) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a dalvik.system.NativeStart.main (metodo nativo) 05-10 20: 05: 51,895: E/AndroidRuntime (30317): causato da: java.io.NotSerializableException: com.rigidbits.test.TestActivity 05-10 20: 05: 51,895: E/AndroidRuntime (30317): a java.io.ObjectOutputStream.writeNewObject (ObjectOutputStream.java:1535) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a java.io.ObjectOutputStream .writeObjectInternal (ObjectOutputStream.java:1847) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java: 1689) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1653) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a java.io.ObjectOutputStream.writeFieldValues ​​(ObjectOutputStream.java:1143) 05-10 20: 05: 51,895: E/AndroidRuntime (30317): a java.io.ObjectOutputStream.defaultWriteObject (ObjectOutputStream.java : 413) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a java.io.ObjectOutputStream.writeHierarchy (ObjectOutputStream.java:1241) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a java.io.ObjectOutputStream.writeNewObject (ObjectOutputStream.java:1575) 05-10 20: 05: 51.895: E/AndroidRuntim e (30317): a java.io.ObjectOutputStream.writeObjectInternal (ObjectOutputStream.java:1847) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a java.io.ObjectOutputStream.writeObject (ObjectOutputStream. java: 1689) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1653) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): a android.os.Parcel.writeSerializable (Parcel.java:1171) 05-10 20: 05: 51,895: E/AndroidRuntime (30317): ... altri 16

Quando ho commentare la riga nel metodo onSaveInstanceState in modo daL'oggettoè non salvato, l'app scompare correttamente.

Qualsiasi aiuto con questo?

+0

solo per interesse rendere il tuo UID '1L' invece di un numero negativo – Blundell

+0

L'ho provato, ma senza fortuna. L'UID è un valore generato da Eclipse. – nhaarman

risposta

21

Ok Credo che il problema è che si sta utilizzando una classe interna privata .

Pertanto ha l'accesso ai metodi e ai campi della classe esterna, ad esempio la vostra attività.

Poiché l'attività non è serializzabile (e quindi non dovrebbe essere), si ottiene l'eccezione.

Un'istanza di InnerClass può esistere solo all'interno di un'istanza di OuterClass e ha accesso diretto ai metodi e ai campi dell'istanza che la include.

enter image description here

ci sono due soluzioni.

  • Fai la tua classe interna statica

  • Spostare il classe interna per essere una classe a sé stante e dichiararlo pubblici

Queste soluzioni sia rendere il vostro Data classe di una classe nella sua proprio diritto e quindi non ha bisogno della tua istanza di attività per esistere

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

+2

Wow, risposta molto chiara, e funziona! Molte grazie! L'ho reso una classe statica, perché ho un sacco di attività che hanno bisogno di una classe Data, e ha campi univoci per ognuna di esse. – nhaarman

Problemi correlati