2012-05-10 39 views
7

Tôi có một số Activity trong đó tôi có Dữ liệu lớp riêng. Trong phương thức onSaveInstanceState, tôi cố gắng lưu ví dụ này là Data. Đây là toàn bộ Hoạt động của tôi:NotSerializableException khi nhấn nút 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; 

    } 
} 

Bây giờ khi tôi thay đổi hướng của thiết bị, đối tượng Data được lưu và đọc như nó phải. Tuy nhiên, khi tôi bấm nút home, các ứng dụng bị treo như sau trong logcat:

05-10 20: 05: 51,895: E/AndroidRuntime (30.317): EXCEPTION Fatal: chính 05-10 20 : 05: 51.895: E/AndroidRuntime (30317): java.lang.RuntimeException: Parcelable gặp IOException viết đối tượng tuần tự (name = com.rigidbits.test.TestActivity $ Data) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại android.os.Parcel.writeSerializable (Parcel.java:1176) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại android.os.Parcel.writeValue (Bưu kiện .java: 1130) 05-10 20: 05: 51.895: E/AndroidR untime (30317): tại android.os.Parcel.writeMapInternal (Parcel.java:488) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại android.os.Bundle.writeToParcel (Bundle. java: 1552) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại android.os.Parcel.writeBundle (Parcel.java:502) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại android.app.ActivityManagerProxy.activityPaused (ActivityManagerNative.java:1615) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại android.app.ActivityThread.handlePauseActivity (ActivityThread.java : 2298) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại android.app.ActivityThread.access $ 1700 (ActivityThread.java:117) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại android.app.ActivityThread $ H.handleMessage (ActivityThread.java:938) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại android.os.Handler.dispatchMessage (Handler.java:99) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại android.os.Looper.loop (Looper.java:130) 05- 10 20: 05: 51.895: E/AndroidRuntime (30317): tại android.app.ActivityThread.main (ActivityThread.java:3683) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại java.lang.reflect.Method.invokeNative (Native Method) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại java.lang.reflect.Method.invoke (Method.java:507) 05- 10 20: 05: 51.895: E/AndroidRuntime (30317): tại com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:862) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại com .android.internal.os.ZygoteInit.main (ZygoteInit.java:620) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại dalvik.system.NativeStart.main (Phương pháp Gốc) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): Gây ra bởi: java.io.NotSerializableException: com.rigidbits.test.TestActivity 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại java.io.ObjectOutputStream.writeNewObject (ObjectOutputStream.java:1535) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại java.io.ObjectOutputStream .writeObjectInternal (ObjectOutputStream.java:1847) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java: 1689) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1653) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại java.io.ObjectOutputStream.writeFieldValues ​​(ObjectOutputStream.java:1143) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại java.io.ObjectOutputStream.defaultWriteObject (ObjectOutputStream.java : 413) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại java.io.ObjectOutputStream.writeHierarchy (ObjectOutputStream.java:1241) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại java.io.ObjectOutputStream.writeNewObject (ObjectOutputStream.java:1575) 05-10 20: 05: 51.895: E/AndroidRuntim e (30317): tại java.io.ObjectOutputStream.writeObjectInternal (ObjectOutputStream.java:1847) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại java.io.ObjectOutputStream.writeObject (ObjectOutputStream. java: 1689) 05-10 20: 05: 51.895: E/AndroidRuntime (30317): tại java.io.ObjectOutputStream.writeObject (ObjectOutputStream.java:1653) 05-10 20: 05: 51.895: E/AndroidRuntime (30.317): tại android.os.Parcel.writeSerializable (Parcel.java:1171) 05-10 20: 05: 51,895: E/AndroidRuntime (30.317): ... 16 hơn

Khi tôi nhận xét dòng trong phương thức onSaveInstanceState đểĐối tượnglà không được lưu, ứng dụng sẽ biến mất chính xác.

Bất kỳ trợ giúp nào về điều này?

+0

chỉ vì lợi ích làm cho UID của bạn '1L' thay vì số âm – Blundell

+0

Tôi đã thử nó, nhưng không có may mắn. UID là một giá trị được tạo ra bởi Eclipse. – nhaarman

Trả lời

21

Ok Tôi tin rằng vấn đề là bạn đang sử dụng lớp bên trong riêng tư.

Do đó, nó có quyền truy cập vào các phương pháp và trường của lớp ngoài của bạn tức là hoạt động của bạn.

Vì hoạt động của bạn không phải là hàng đợi (và vì vậy nó không được là), bạn sẽ nhận được ngoại lệ của mình.

Một thể hiện của InnerClass chỉ có thể tồn tại trong một trường hợp của OuterClass và có quyền truy cập trực tiếp vào các phương pháp và trường của trường hợp kèm theo.

enter image description here

Có hai giải pháp.

  • Make lớp bên trong của bạn tĩnh

  • Di chuyển lớp bên trong của bạn để có một lớp học riêng của mình và tuyên bố công khai

Những giải pháp này làm cho cả hai lớp Data của bạn một lớp trong của nó của riêng bạn và sau đó nó không cần trường hợp hoạt động của bạn để tồn tại

Tham chiếu: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

+2

Wow, câu trả lời rất rõ ràng, và nó hoạt động! Cảm ơn rất nhiều! Tôi đã biến nó thành một lớp tĩnh, bởi vì tôi có rất nhiều hoạt động cần một lớp Data, và nó có các trường duy nhất cho mỗi lớp. – nhaarman

Các vấn đề liên quan