在intent中传递TurnBasedMatch时出现BadParcelableException

时间:2014-02-03 20:58:38

标签: android google-play-services

我正在开发一款基于回合制多人游戏支持的游戏。要获取播放器当前游戏的列表,我使用GamesClient.loadTurnBasedMatches方法。这工作正常,但当我尝试打开一个新的活动并传递匹配它崩溃。我用来启动新活动的代码是

    private void openMatch(TurnBasedMatch match) {
    Intent intent = new Intent(this, MultiPlayerGame.class);
    intent.putExtra("match", match);
    startActivity(intent);
}

但是在执行这段代码后我得到了这个错误:(它有限,所以我看不到整个包名)

  

02-03 21:28:02.880:E / AndroidRuntime(5513):java.lang.RuntimeException:无法启动活动ComponentInfo {com.mypackage.MultiPlayerGame}:android.os.BadParcelableException:Parcelable协议需要Parcelable。 com.google.android.gms.games.multiplayer.turnbased.a上的创建者对象名为CREATOR

它实际崩溃的行是:

match = getIntent().getExtras().getParcelable("match");

现在我不确定这是不是我的错,或者在play-services-lib中是否存在错误。或者它与proguard有关?顺便说一句,如果我使用内置的意图向用户展示他的游戏同样的方法。 (在onActivityResult中)

if (request == RC_LOOK_AT_MATCHES) {
    TurnBasedMatch match = data.getParcelableExtra(GamesClient.EXTRA_TURN_BASED_MATCH);
if (match != null)
  openMatch(match);
}

4 个答案:

答案 0 :(得分:0)

您的TurnBasedMatch必须实施Parcelable合同。请参阅examples herehere

答案 1 :(得分:0)

我设法通过仅将matchId发送到下一个活动来解决它。在该活动中,我使用GamesClient.getTurnBasedMatch。可能是默认意图在背景中执行此操作但我不确定。

答案 2 :(得分:0)

尝试

intent.putExtra("match", new TurnBasedMatchEntity(match));

TurnBasedMatchEntity是一个实现TurnBasedMatch的类,支持作为Parcelable发送。您可以像以前一样检索它。

TurnBasedMatch match = getIntent().getExtras().getParcelable("match");

答案 3 :(得分:0)

TurnBasedMatch(及其所有实现)实现Freezable<>,其中freeze()方法。调用它将为您提供适合序列化的实例。

我怀疑(但尚未确认)对freeze()的调用只会返回TurnBasedMatchEntity个对象。这个解决方案的好处是你不必关心;所有你必须关心的是界面中定义的内容。

作为旁注,TurnBasedMatch界面扩展为Parcelable,其中应该意味着每个实现都是可以分配的......但它似乎TurnBasedMatchRef没有&# 39; t实际实现它(因此例外)。实现不应该违反这样的接口,但看起来就是这样。