Android 活动能够在屏幕旋转中幸存下来,但不能最小化



好的,所以我让我的应用程序工作,这样当屏幕方向改变时,它会将所有重要的变量信息存储在savedInstanceState捆绑包中,然后在再次创建活动时将其读回没有问题。 当我使用自定义对象的 ArrayList 时,这有点棘手,所以我在我的自定义类中实现了可序列化。 这有助于它用于屏幕旋转,但是当我单击主页按钮或无论如何最小化应用程序时,它崩溃了。

这是抛出的错误:

01-23 10:50:54.961  19756-19756/com.example.spencers.arcgisgeodb E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.example.spencers.arcgisgeodb.agGDBFeatureTable)
            at android.os.Parcel.writeSerializable(Parcel.java:1285)
            at android.os.Parcel.writeValue(Parcel.java:1233)
            at android.os.Parcel.writeMapInternal(Parcel.java:591)
            at android.os.Bundle.writeToParcel(Bundle.java:1646)
            at android.os.Parcel.writeBundle(Parcel.java:605)
            at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2318)
            at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3100)
            at android.os.Handler.handleCallback(Handler.java:730)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.io.NotSerializableException: com.esri.core.geodatabase.GeodatabaseFeatureTable
            at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
            at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
            at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
            at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
            at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
            at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
            at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
            at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
            at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
            at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
            at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
            at android.os.Parcel.writeSerializable(Parcel.java:1280)
            at android.os.Parcel.writeValue(Parcel.java:1233)
            at android.os.Parcel.writeMapInternal(Parcel.java:591)
            at android.os.Bundle.writeToParcel(Bundle.java:1646)
            at android.os.Parcel.writeBundle(Parcel.java:605)
            at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2318)
            at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3100)
            at android.os.Handler.handleCallback(Handler.java:730)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)

根本问题似乎是这一行:

由以下原因引起:java.io.NotSerializableException:com.esri.core.geodatabase.GeodatabaseFeatureTable

该类是我正在使用的外部库,不可编辑。

存储在 savedInstanceState 捆绑包中的自定义类的一部分:

public class agGDBFeatureTable implements Serializable {
    private static final long serialVersionUID = 1L;
    private GeodatabaseFeatureTable geodatabaseFeatureTable = null;
    private boolean active = true;
    private agLegendSymbol legendSymbols;

这是我的onSaaveInstanceState方法的代码:

@Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        Log.i("Saved Instance", "onSaveInstanceState");
        for (int i = 0; i<gdbList.size(); i++) {
            savedInstanceState.putSerializable(i + "", gdbList.get(i));
        }
        savedInstanceState.putInt("NUMBEROFLAYERS",gdbList.size());
     }
现在,我的

问题是,为什么我的自定义对象可以序列化、存储在捆绑包中并在屏幕旋转时重新启动,但是当应用程序最小化并经历相同的过程时,它会崩溃并引发该错误?我该如何解决它?

实现 Serializable 的类的所有字段也必须是可序列化的。显然(例外情况)地理数据库要素表不是。如果字段不可序列化,则必须将其标记为瞬态,如下所示:

private transient GeodatabaseFeatureTable geodatabaseFeatureTable = null;

这样您就不会收到异常。现在,您可以放心,此对象在反序列化后不会持久化并再次为 null,或者您可以执行以下操作之一:

  1. 扩展 T地理数据库FeatureTable 类并在此处实现可序列化,并改用扩展类 - 注意:当然,如果类是最终的,则不是一个选项
  2. 通过
  3. 重写 writeObject 和 readObject 方法,并从 GeodatabaseFeatureTable 对象内部访问相关信息,直接在 agGDBFeatureTable 类中处理该对象的序列化 - 注意:很可能并非所有您需要的东西都可以从外部访问

我希望这有所帮助。祝你好运!

最新更新