如何使用Google Play游戏服务从多个排行榜加载当前用户的分数?

时间:2017-01-10 19:19:09

标签: android google-play-games

在我的游戏加载时,我希望获得当前玩家所有级别(我当前有22个)的所有游戏分数。我这样做:

@Override
public void onSignInSucceeded() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 1; i < count; ++i)
                score = getScoreGPGS(LEVEL_LIST(i).leaderBoardID);
            // somehow use this score
        }
    }).start();
}

在哪里

public long getScoreGPGS(String leaderBoardID) {
    try {
        PendingResult<Leaderboards.LoadPlayerScoreResult> result;
        result = Games.Leaderboards.loadCurrentPlayerLeaderboardScore(gameHelper.getApiClient(),
                leaderBoardID, LeaderboardVariant.TIME_SPAN_ALL_TIME,
                LeaderboardVariant.COLLECTION_PUBLIC);
        LeaderboardScore score = result.await().getScore();
        if (score != null)
            return score.getRawScore();
        else
            return 0;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return -1;
}

我知道result.await().getScore();不是最好的方法,但其他方式也无法工作(我尝试使用回调以及为所有排行榜创建PendingResults,然后在循环中等待它完成,这不是这种情况,这个对我来说更方便。

问题在于,我只能获得3个第一级别的分数(在任何互联网连接上的任何设备上)。如果我在失败的级别上执行result.await()。getStatus()它将不会成功或取消或中断,具体它返回什么我不知道因为我无法调试它。

UPD :似乎服务器阻止了我的通话。我尝试在每次调用之间暂停线程1秒,但它没有工作,但是当我尝试暂停线程10秒时它确实有效,但只有6个级别,可能增加这个时间会有所帮助,但即使是10秒是等待的重要时刻。也许这个问题有不同的方法吗?

UPD2 :在Google API控制台中,这些调用显示为&#34;客户端错误&#34;在API games.scores.get上,但我很确定我没有超过每用户每100秒500次查询的配额。

1 个答案:

答案 0 :(得分:0)

您正在经历服务器的速率限制。有关更多信息,请阅读https://developers.google.com/games/services/quota。每个用户每100秒的呼叫数量有限制,您可以在开发者控制台上查看API并查看值。您需要将您的请求保持在该限制之下。

您可以申请增加限制,这是解决问题的一种方法,另一种方法可能是缓存结果并对需要进行的任何更新保持聪明。

或者,听起来您可能希望自己保留一个分数数据库,而不是使用排行榜作为数据存储区。像Firebase Realtime Database这样的东西可能更合适。