在我的游戏加载时,我希望获得当前玩家所有级别(我当前有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次查询的配额。
答案 0 :(得分:0)
您正在经历服务器的速率限制。有关更多信息,请阅读https://developers.google.com/games/services/quota。每个用户每100秒的呼叫数量有限制,您可以在开发者控制台上查看API并查看值。您需要将您的请求保持在该限制之下。
您可以申请增加限制,这是解决问题的一种方法,另一种方法可能是缓存结果并对需要进行的任何更新保持聪明。
或者,听起来您可能希望自己保留一个分数数据库,而不是使用排行榜作为数据存储区。像Firebase Realtime Database这样的东西可能更合适。