回合制比赛在第一次加载后消失

24

我正在使用Google Play服务开发一款Android游戏,用于创建回合制比赛。

起初一切都很好,我使用以下代码为已登录的用户加载回合制比赛:


```html ```
Games.TurnBasedMultiplayer.loadMatchesByStatus(getApiClient(),
        new int[]{TurnBasedMatch.MATCH_TURN_STATUS_MY_TURN,
                TurnBasedMatch.MATCH_TURN_STATUS_THEIR_TURN,
                TurnBasedMatch.MATCH_TURN_STATUS_INVITED,
                TurnBasedMatch.MATCH_TURN_STATUS_COMPLETE})
        .setResultCallback(this);

最近,我的回调函数被调用,但没有匹配到任何比赛(状态响应为OK),以前它总是加载所有与给定状态之一相符的比赛。我清除了手机上的Google Play服务缓存并重新启动了设备。在那个时候,所有的比赛都再次显示,直到下一次我打开应用程序,然后所有比赛都消失了。

一旦我开始一场新的比赛,使用上述方法(刷新列表)可以一直看到这场比赛,直到我关闭应用程序。下一次启动后,该比赛也消失了。

我必须说,该游戏尚未发布,但正在Google Play开发者控制台的测试阶段中。我在模拟器上发现了同样的问题。它运行得很好,但突然出现了与我的真实设备相同的问题(使用更高版本的构建,因此不是单个代码更改引起的问题)。

是否有人注意到了这种行为或者有解决方法?

它可能与将多个应用程序连接到一个游戏有关吗?我连接了两个使用调试证书签署的应用程序,并在今天下午添加了一个签署APK的应用程序。当我使用签名APK时,它又可以正常工作,直到我部署了新的测试应用程序(使用调试签名)。但回到签名APK后,该错误仍然存在。

由于似乎没有人知道答案,让我重新描述问题。我是否应该在设备上缓存TurnBasedMatches?我再次删除了Play服务缓存并重新打开了我的应用程序。结果如何?数百个游戏的列表(因为我每次测试时都必须开始一场新比赛...)

这是我处理loadMatchesResult的代码:

@Override
public void onResult(TurnBasedMultiplayer.LoadMatchesResult loadMatchesResult)
{
    showToast("GotMatches status: " + loadMatchesResult.getStatus().getStatusCode());

    //add matches to listview (only caching matchId, no references to turnbasedmatch)

    loadMatchesResult.getMatches().getMyTurnMatches().close();
    loadMatchesResult.getMatches().getInvitations().close();
    loadMatchesResult.getMatches().getTheirTurnMatches().close();
    loadMatchesResult.getMatches().getCompletedMatches().close();
    loadMatchesResult.release();

}

发现另一个感兴趣的点...看起来问题出现在将新apk部署到设备时...一旦我部署了新的apk(无论是从Google Play安装alpha版本还是直接从Android Studio调试版本),匹配项就会消失。当我不更改apk时,我可以重新启动手机/关闭应用程序,它可以正常工作...

如果我通过Play商店更新应用程序,问题也会发生...应该有更多人遇到这个问题!


2
我在我的回合制游戏中遇到了非常类似的问题。当测试人员从Google Play商店更新我的应用程序时,回合制比赛经常会消失。在开发过程中,当我在设备上安装新版本的应用程序时,同样的事情也会发生。 - tron
1
在Github上有一个问题,网址是https://github.com/playgameservices/android-basic-samples/issues/141。两周前有人建议查看它,但没有其他更新。就我个人而言,我已经完全删除了Google Play游戏,并切换到另一个(自定义)后端。 - matsjoe
@matsjoe 是的,我已经看到那个帖子了,但问题还没有解决。我几乎完成了使用Google Play游戏服务的应用程序。不幸的是,我没有时间或金钱去切换到另一个后端。 - user2456977
我开始使用Parse,它不是一个即插即用的多人匹配框架,但我设法在大约两周内切换完成。 - matsjoe
当安装新的apk时,会出现一个重置比赛的错误。如果您有最新的Play Games应用程序,它应该已经得到解决。 - Clayton Wilkinson
显示剩余3条评论
2个回答

1

https://developer.android.com/reference/com/google/android/gms/common/api/PendingResult.html#setResultCallback(com.google.android.gms.common.api.ResultCallback 获取

在使用await()检索结果或通过结果回调传递结果之后,再次尝试检索结果是错误的。调用者或回调接收者有责任释放与返回结果相关联的任何资源。某些结果类型可能会实现Releasable,此时应使用release()来释放相关资源。

当您尝试再次获取结果时,会出现错误,直到您释放与返回结果相关联的资源,因此清除缓存可使它们再次可见。您需要访问设备的缓存并从中显示结果,或者在想要再次访问结果时清除相关资源(程序内部)。


我遇到了类似的问题。每当我从Android Studio运行我的应用程序时,我就会失去所有保存的游戏。这种情况是上周突然发生的。 - user2456977
我将尝试弄清楚如果通过Google Play更新应用程序会发生什么。如果问题只在开发过程中出现,我可以通过手动清空缓存来解决它(远非完美...),但如果在Google Play更新时也出现问题,那就绝对不行了。 - matsjoe
1
使用Play商店更新时出现相同的问题...这真的阻止了我发布我的应用程序... - matsjoe
我的猜测是它不会重复传输相同的数据以减少数据成本,同时也为了防止攻击,如果检测到您设备上已有的数据,它只会发送您还没有的部分。如果您仅显示回调中给出的内容,则只会有新的数据,而不是已经显示的匹配内容。为了查看已经显示的内容,您需要在回调之前清除数据,或访问设备缓存中的数据。 - Mitchell Carroll
1
如果是这种情况,您会期望游戏服务视图正确显示数据,但实际上它并没有。在更新 APK 时,playservices 库中似乎存在某个 bug。 - matsjoe
显示剩余4条评论

0

我曾经也遇到过同样的问题,直到我在开发者控制台中找到了“已保存的游戏”:

  1. 进入游戏服务 -> 游戏详情 -> 已保存的游戏
  2. 将项目设置为“开启”

Saved Games item in the Developer Console

这应该可以解决你的问题。


1
不幸的是,这对我没有用。尽管已经开启了“已保存的游戏”,但我仍然有问题。 - tron
我们在这里也遇到了一些缺点。Play商店上的更新似乎可以保留游戏,但在开发过程中却不行。有时它们也会留下来,很奇怪。 - Paul Spiesberger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接