读取可打包对象时出错(应用程序恢复后)

Error with reading parcelable object (after application is restored)

我必须将我的自定义 class 保存在保存状态包中。所以,我把它做成了 Parcelable,它看起来不错。当我旋转屏幕时,一切都很好。但是,当我最小化我的应用程序,打开其他应用程序,旋转屏幕并尝试返回我的应用程序(从最近的应用程序)时,它崩溃了。

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.game/com.example.game.MainActivity}: java.lang.RuntimeException: Parcelable encountered ClassNotFoundException reading a Serializable object (name = com.example.game.Player)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2306)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2366)
        at android.app.ActivityThread.access0(ActivityThread.java:149)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5297)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
 Caused by: java.lang.RuntimeException: Parcelable encountered ClassNotFoundException reading a Serializable object (name = com.example.game.Player)
        at android.os.Parcel.readSerializable(Parcel.java:2378)
        at android.os.Parcel.readValue(Parcel.java:2197)
        at android.os.Parcel.readListInternal(Parcel.java:2520)
        at android.os.Parcel.readList(Parcel.java:1655)
        at com.example.game.Players.<init>(Players.java:106)
        at com.example.game.Players.createFromParcel(Players.java:96)
        at com.example.game.Players.createFromParcel(Players.java:93)
        at android.os.Parcel.readParcelable(Parcel.java:2246)
        at android.os.Parcel.readValue(Parcel.java:2146)
        at android.os.Parcel.readArrayMapInternal(Parcel.java:2479)
        at android.os.BaseBundle.unparcel(BaseBundle.java:221)
        at android.os.Bundle.getSparseParcelableArray(Bundle.java:871)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:831)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1049)
        at android.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:1864)
        at android.app.Activity.onCreate(Activity.java:949)
        at com.example.game.MainActivity.onCreate(MainActivity.java:24)
        at android.app.Activity.performCreate(Activity.java:6020)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2259)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2366)
            at android.app.ActivityThread.access0(ActivityThread.java:149)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5297)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
 Caused by: java.lang.ClassNotFoundException: com.example.game.Player
        at java.lang.Class.classForName(Native Method)
        at java.lang.Class.forName(Class.java:308)
        at android.os.Parcel.resolveClass(Parcel.java:2364)
        at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1641)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:657)
        at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1782)
        at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
        at android.os.Parcel.readSerializable(Parcel.java:2372)
            at android.os.Parcel.readValue(Parcel.java:2197)
            at android.os.Parcel.readListInternal(Parcel.java:2520)
            at android.os.Parcel.readList(Parcel.java:1655)
            at com.example.game.Players.<init>(Players.java:106)
            at com.example.game.Players.createFromParcel(Players.java:96)
            at com.example.game.Players.createFromParcel(Players.java:93)
            at android.os.Parcel.readParcelable(Parcel.java:2246)
            at android.os.Parcel.readValue(Parcel.java:2146)
            at android.os.Parcel.readArrayMapInternal(Parcel.java:2479)
            at android.os.BaseBundle.unparcel(BaseBundle.java:221)
            at android.os.Bundle.getSparseParcelableArray(Bundle.java:871)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:831)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1049)
            at android.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:1864)
            at android.app.Activity.onCreate(Activity.java:949)
            at com.example.game.MainActivity.onCreate(MainActivity.java:24)
            at android.app.Activity.performCreate(Activity.java:6020)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2259)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2366)
            at android.app.ActivityThread.access0(ActivityThread.java:149)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5297)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
 Caused by: java.lang.ClassNotFoundException: com.example.game.Player
        at java.lang.Class.classForName(Native Method)
        at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
        at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
            at java.lang.Class.classForName(Native Method)
            at java.lang.Class.forName(Class.java:308)
            at android.os.Parcel.resolveClass(Parcel.java:2364)
            at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1641)
            at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:657)
            at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1782)
            at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761)
            at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983)
            at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
            at android.os.Parcel.readSerializable(Parcel.java:2372)
            at android.os.Parcel.readValue(Parcel.java:2197)
            at android.os.Parcel.readListInternal(Parcel.java:2520)
at android.os.Parcel.readList(Parcel.java:1655)
            at com.example.game.Players.<init>(Players.java:106)
            at com.example.game.Players.createFromParcel(Players.java:96)
            at com.example.game.Players.createFromParcel(Players.java:93)
            at android.os.Parcel.readParcelable(Parcel.java:2246)
            at android.os.Parcel.readValue(Parcel.java:2146)
            at android.os.Parcel.readArrayMapInternal(Parcel.java:2479)
            at android.os.BaseBundle.unparcel(BaseBundle.java:221)
            at android.os.Bundle.getSparseParcelableArray(Bundle.java:871)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:831)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1049)
            at android.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:1864)
            at android.app.Activity.onCreate(Activity.java:949)
            at com.example.game.MainActivity.onCreate(MainActivity.java:24)
            at android.app.Activity.performCreate(Activity.java:6020)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2259)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2366)
            at android.app.ActivityThread.access0(ActivityThread.java:149)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5297)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
     Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

所以,玩家是可以打包的 class。它基本上是一个列表。播放器是另一个 class,可序列化。

Player.java

import java.io.Serializable;

public class Player implements Serializable{

private String name;
private int points = 0;

// getters and setters
}

Players.java

public class Players implements Parcelable {

    private List<Player> players;

    //constructor, getters, setters

@Override
public int describeContents() {

    return 0;

}

@Override
public void writeToParcel(Parcel parcel, int i) {

    parcel.writeList(players);

}

public static final Parcelable.Creator<Players> CREATOR = new Parcelable.Creator<Players>() {

    public Players createFromParcel(Parcel in) {
        return new Players(in);
    }

    public Players[] newArray(int size) {
        return new Players[size];
    }
};

public Players(Parcel in) {

    in.readList(players, List.class.getClassLoader());

}
}

此时我不知道为什么我的应用程序崩溃了。当我旋转它时没问题,当我最小化和最大化时没问题,当我最小化时,做一些工作(打开另一个应用程序,旋转屏幕等)并尝试从最近它崩溃时最大化它。

如有任何帮助,我将不胜感激 ;) !

下午好!

可打包 class 仅嵌套可打包对象。

在您的案例中,Player 不可打包,用于 Parcelable class 播放器。也尝试在 Player class 中实现 Parcelable

您最小化和打开应用程序的问题是因为 Parcelable 对象已保存但未正确检索。

尝试在您的代码中进行以下更改:

public class Player implements Parcelable{

String name;
int points;

// getter setter

public static final Creator<Player> CREATOR = new Parcelable.Creator<Player>() {
    @Override
    public Player createFromParcel(Parcel in) {
        return new Player(in);
    }

    @Override
    public Player[] newArray(int size) {
        return new Player[size];
    }
};

public Player(Parcel in) {
    this.name = in.readString();
    this.points = in.readInt();
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(name);
    dest.writeInt(points);
}
}

并在 Players class 阅读列表时替换:

in.readList(players, List.class.getClassLoader());

与 :

players = new ArrayList<>();
in.readList(players, getClass().getClassLoader());

这些更改后您的代码应该可以正常工作。