按下主屏幕按钮时出现NotSerializableException [英] NotSerializableException when pressing home button
问题描述
我有一个 Activity
,其中有一个私有类Data.在 onSaveInstanceState
方法中,我尝试将其保存为 Data
的实例.这是我的整个活动:
I have an Activity
in which I have a private class Data.
In the onSaveInstanceState
method, I try to save this an instance of Data
.
This is my whole Activity:
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;
}
}
现在,当我更改设备的方向时,将保存并读取 Data
对象.但是,当我按下主页"按钮时,该应用程序将在日志目录中崩溃,并显示以下内容:
Now when I change the orientation of the device, the Data
object is saved and read as it should. However, when I press the home button, the app crashes with the following in the logcat:
05-10 20:05:51.895:E/AndroidRuntime(30317):致命异常:主05-10 20:05:51.895:E/AndroidRuntime(30317):java.lang.RuntimeException:遇到IOException编写的Parcelable可序列化的对象(名称= com.rigidbits.test.TestActivity $ Data)05-10 20:05:51.895:E/AndroidRuntime(30317):atandroid.os.Parcel.writeSerializable(Parcel.java:1176)05-1020:05:51.895:E/AndroidRuntime(30317):在android.os.Parcel.writeValue(Parcel.java:1130)05-10 20:05:51.895:E/AndroidRuntime(30317):在android.os.Parcel.writeMapInternal(Parcel.java:488)05-1020:05:51.895:E/AndroidRuntime(30317):在android.os.Bundle.writeToParcel(Bundle.java:1552)05-10 20:05:51.895:E/AndroidRuntime(30317):在android.os.Parcel.writeBundle(Parcel.java:502)05-10 20:05:51.895:E/AndroidRuntime(30317):在android.app.ActivityManagerProxy.activityPaused(ActivityManagerNative.java:1615)05-10 20:05:51.895:E/AndroidRuntime(30317):atandroid.app.ActivityThread.handlePauseActivity(ActivityThread.java:2298)05-10 20:05:51.895:E/AndroidRuntime(30317):atandroid.app.ActivityThread.access $ 1700(ActivityThread.java:117)05-1020:05:51.895:E/AndroidRuntime(30317):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:938)05-10 20:05:51.895:E/AndroidRuntime(30317):atandroid.os.Handler.dispatchMessage(Handler.java:99)05-1020:05:51.895:E/AndroidRuntime(30317):在android.os.Looper.loop(Looper.java:130)05-10 20:05:51.895:E/AndroidRuntime(30317):在android.app.ActivityThread.main(ActivityThread.java:3683)05-1020:05:51.895:E/AndroidRuntime(30317):在java.lang.reflect.Method.invokeNative(本机方法)05-1020:05:51.895:E/AndroidRuntime(30317):在java.lang.reflect.Method.invoke(Method.java:507)05-10 20:05:51.895:E/AndroidRuntime(30317):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:862)05-10 20:05:51.895:E/AndroidRuntime(30317):atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)05-1020:05:51.895:E/AndroidRuntime(30317):在dalvik.system.NativeStart.main(本机方法)05-10 20:05:51.895:E/AndroidRuntime(30317):由以下原因引起:java.io.NotSerializableException:com.rigidbits.test.TestActivity 05-10 20:05:51.895:E/AndroidRuntime(30317):在java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1535)05-10 20:05:51.895:E/AndroidRuntime(30317):atjava.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1847)05-10 20:05:51.895:E/AndroidRuntime(30317):atjava.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1689)05-10 20:05:51.895:E/AndroidRuntime(30317):atjava.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1653)05-10 20:05:51.895:E/AndroidRuntime(30317):atjava.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1143)05-10 20:05:51.895:E/AndroidRuntime(30317):atjava.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:413)05-10 20:05:51.895:E/AndroidRuntime(30317):atjava.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1241)05-10 20:05:51.895:E/AndroidRuntime(30317):atjava.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1575)05-10 20:05:51.895:E/AndroidRuntime(30317):atjava.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1847)05-10 20:05:51.895:E/AndroidRuntime(30317):atjava.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1689)05-10 20:05:51.895:E/AndroidRuntime(30317):atjava.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1653)05-10 20:05:51.895:E/AndroidRuntime(30317):atandroid.os.Parcel.writeSerializable(Parcel.java:1171)05-1020:05:51.895:E/AndroidRuntime(30317):...还有16个
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 encountered IOException writing serializable object (name = 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 Method) 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): at dalvik.system.NativeStart.main(Native Method) 05-10 20:05:51.895: E/AndroidRuntime(30317): Caused by: 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(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 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 more
当我在 onSaveInstanceState
方法中注释该行,以便不保存 Data
对象时,该应用程序会正确消失.
When I comment the line in the onSaveInstanceState
method so the Data
object is not saved, the app disappears correctly.
对此有任何帮助吗?
推荐答案
好吧,我相信问题在于您正在使用私有内部类.
Ok I believe the problem is that you are using a private inner class.
因此,它可以访问外部类的方法和字段,即您的活动.
Therefore it has access to the methods and fields of your outer class i.e. your activity.
因为您的活动不是可序列化的(因此不应该),所以您得到了例外.
Because your activity isn't serializble (and so it shouldn't be), your getting your exception.
InnerClass的实例只能存在于OuterClass的实例中,并且可以直接访问其封闭实例的方法和字段.
An instance of InnerClass can exist only within an instance of OuterClass and has direct access to the methods and fields of its enclosing instance.
有两种解决方案.
-
使内部类保持静态
Make your inner class static
将内部类移动为自己的类并声明为公共
Move your inner class to be a class of its own and declare it public
这些解决方案都使您的 Data
类本身具有一个类,然后不需要您的活动实例存在
These solutions both make your Data
class a class in its own right and then it doesn't need your activity instance to exist
参考: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
这篇关于按下主屏幕按钮时出现NotSerializableException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!