按下主屏幕按钮时出现NotSerializableException [英] NotSerializableException when pressing home button

查看:79
本文介绍了按下主屏幕按钮时出现NotSerializableException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆