1

我试图在两个活动(一个游戏活动和一个暂停屏幕活动)之间传递一个可打包的对象,因为我需要保存和恢复屏幕上敌人的位置、分数和计时器。现在,当我这样做时,我得到了分数和计时器,但没有敌人。我稍微调整了一下,发现我在敌人类中的位图可能是一个问题,所以我用包含位图位置的字符串解决了它。现在我还有其他一些事情要解决,这一切都归结为我制作了一个 Bundle 并将可打包的对象放入所述的 bundle 中,然后将其传递给其他活动。现在,我只得到ClassNotFoundException when unmarshalling错误。这是我正在使用的代码:

暂停时的第一个活动

Intent intent = new Intent(GameActivity.this, PauseScreenActivity.class);
Bundle b = new Bundle();
gameState = new GameState(new ArrayList<>(customGameView.getEnemies()), score, timeLeftInMillis, xPosition, yPosition);
b.putParcelable("gameState", gameState);
intent.putExtra("bundle", b);
startActivity(intent);

第二个活动检索数据

Bundle b = getIntent().getBundleExtra("bundle");
gameState = b.getParcelable("gameState");

第二个活动发回数据

Intent intent = new Intent(PauseScreenActivity.this, GameActivity.class);
Bundle b = new Bundle();
b.putParcelable("gameState", gameState);
intent.putExtra("bundle", b);
startActivity(intent);

检索数据的第一个活动

Bundle b = getIntent().getBundleExtra("bundle");
gameState = b.getParcelable("gameState");

现在错误来自第二个活动的 onCreate 和b.getParcelable("gameState");. 我会感谢所有的帮助,在此先感谢。

4

1 回答 1

0

来自Bundle#getParcelable 文档

注意:如果期望值不是Android平台提供的类,必须先setClassLoader(java.lang.ClassLoader)用正确的调用ClassLoader否则,此方法可能会抛出异常或返回null

我一直看到人们推荐的方式(这比使用 ClassLoaders 更简单!)是将其设置为 Intent 上的 Extra:

Intent intent = new Intent(GameActivity.this, PauseScreenActivity.class);
gameState = new GameState(new ArrayList<>(customGameView.getEnemies()), score, timeLeftInMillis, xPosition, yPosition);
intent.putExtra("gameState", gameState);
startActivity(intent);

然后拆包

gameState = getIntent().getParcelableExtra("gameState");

哪个更友好

如果这不起作用,您可能希望发布您的GameState课程和异常中的堆栈跟踪,以便人们可以看到发生了什么

于 2020-08-21T01:23:43.287 回答