Передача баллов в списки лидеров Google Play игр и отображение новых рангов

Я работаю над игрой, где оценки представлены в лидеров в действии, а новые высокие баллы отображаются с рангом в фрагменте. У меня есть что-то (несколько) функциональное, но вероятность успеха составляет ~ 10%.

Поток выглядит следующим образом:

Метод handleLeaders

Этот метод получает текущие баллы для каждой таблицы лидеров, и если новый счет лучше, он отправляется, и новый объект newHigh создается со счетом и добавляется в ArrayList. После того, как все 3 таблицы лидеров обработаны, вызывается метод setHighs. (Ошибки проверяются в каждом вызове в таблице лидеров)

public void handleLeaders(boolean win, int size, double t, final int toupees) { if(win) { final long time = (long) t; // Toupees Games.Leaderboards.loadCurrentPlayerLeaderboardScore(mGoogleApiClient, getString(R.string.leaderboard_trumps_toupeed), LeaderboardVariant.TIME_SPAN_ALL_TIME, LeaderboardVariant.COLLECTION_PUBLIC).setResultCallback( new ResultCallback<Leaderboards.LoadPlayerScoreResult>() { @Override public void onResult(Leaderboards.LoadPlayerScoreResult arg0) { LeaderboardScore c = arg0.getScore(); int old; if (c != null) old = (int) c.getRawScore(); else old = 0; Games.Leaderboards.submitScore(mGoogleApiClient, getResources().getString(R.string.leaderboard_trumps_toupeed), old + toupees); GameEndOverlay.newHighs.add(new newHigh("Trumps Toupee'd", old + toupees)); Status status = arg0.getStatus(); int statusCode = status.getStatusCode(); if (statusCode == GamesStatusCodes.STATUS_NETWORK_ERROR_NO_DATA) GameEndOverlay.highsError = true; if(++GameEndOverlay.leaderboardsCompleted == 3) ((GameEndOverlay) gameEndOverlayFrag).setHighs(); } }); if (size == getResources().getInteger(R.integer.size_apprentice)) { // Wins Games.Leaderboards.loadCurrentPlayerLeaderboardScore(mGoogleApiClient, getString(R.string.leaderboard_apprentice_wins), LeaderboardVariant.TIME_SPAN_ALL_TIME, LeaderboardVariant.COLLECTION_PUBLIC).setResultCallback( new ResultCallback<Leaderboards.LoadPlayerScoreResult>() { @Override public void onResult(Leaderboards.LoadPlayerScoreResult arg0) { LeaderboardScore c = arg0.getScore(); int wins; if (c != null) wins = (int) c.getRawScore(); else wins = 0; Games.Leaderboards.submitScore(mGoogleApiClient, getResources().getString(R.string.leaderboard_apprentice_wins), wins + 1); GameEndOverlay.newHighs.add(new newHigh("Apprentice Wins", wins + 1)); Status status = arg0.getStatus(); int statusCode = status.getStatusCode(); if (statusCode == GamesStatusCodes.STATUS_NETWORK_ERROR_NO_DATA) GameEndOverlay.highsError = true; if(++GameEndOverlay.leaderboardsCompleted == 3) ((GameEndOverlay) gameEndOverlayFrag).setHighs(); } }); // Speed Games.Leaderboards.loadCurrentPlayerLeaderboardScore(mGoogleApiClient, getString(R.string.leaderboard_fastest_apprentice), LeaderboardVariant.TIME_SPAN_ALL_TIME, LeaderboardVariant.COLLECTION_PUBLIC).setResultCallback( new ResultCallback<Leaderboards.LoadPlayerScoreResult>() { @Override public void onResult(Leaderboards.LoadPlayerScoreResult arg0) { LeaderboardScore c = arg0.getScore(); long old_time; if(c != null) { old_time = c.getRawScore(); Log.d("time", old_time + ""); if(time < old_time) { Games.Leaderboards.submitScore(mGoogleApiClient, getResources().getString(R.string.leaderboard_fastest_apprentice), time); GameEndOverlay.newHighs.add(new newHigh("Fastest Apprentice", time)); } } else { Games.Leaderboards.submitScore(mGoogleApiClient, getResources().getString(R.string.leaderboard_fastest_apprentice), time); GameEndOverlay.newHighs.add(new newHigh("Fastest Apprentice", time)); } Status status = arg0.getStatus(); int statusCode = status.getStatusCode(); if (statusCode == GamesStatusCodes.STATUS_NETWORK_ERROR_NO_DATA) GameEndOverlay.highsError = true; if(++GameEndOverlay.leaderboardsCompleted == 3) ((GameEndOverlay) gameEndOverlayFrag).setHighs(); } }); } } 

Метод setHighs

Этот метод получает ряды каждого соответствующего newHigh и сохраняет новый ранг внутри объекта. После того, как собраны все ряды, вызывается метод setSecondHighs. (Ошибки проверяются в каждом вызове в таблице лидеров)

 public void setHighs() { if(getActivity() == null) return; ranksComputed = 0; for(newHigh highRaw : newHighs) { final newHigh high = highRaw; switch(high.getName()) { case "Trumps Toupee'd": Games.Leaderboards.loadCurrentPlayerLeaderboardScore(mGoogleApiClient, getString(R.string.leaderboard_trumps_toupeed), LeaderboardVariant.TIME_SPAN_ALL_TIME, LeaderboardVariant.COLLECTION_PUBLIC).setResultCallback( new ResultCallback<Leaderboards.LoadPlayerScoreResult>() { @Override public void onResult(Leaderboards.LoadPlayerScoreResult arg0) { if(arg0.getScore() == null) { highsError = true; ranksComputed++; if(ranksComputed >= newHighs.size()) setSecondHighs(); return; } high.setRank(arg0.getScore().getRank()); Status status = arg0.getStatus(); int statusCode = status.getStatusCode(); if (statusCode == GamesStatusCodes.STATUS_NETWORK_ERROR_NO_DATA) GameEndOverlay.highsError = true; ranksComputed++; if(ranksComputed >= newHighs.size()) setSecondHighs(); } }); break; case "Apprentice Wins": Games.Leaderboards.loadCurrentPlayerLeaderboardScore(mGoogleApiClient, getString(R.string.leaderboard_apprentice_wins), LeaderboardVariant.TIME_SPAN_ALL_TIME, LeaderboardVariant.COLLECTION_PUBLIC).setResultCallback( new ResultCallback<Leaderboards.LoadPlayerScoreResult>() { @Override public void onResult(Leaderboards.LoadPlayerScoreResult arg0) { if(arg0.getScore() == null) { highsError = true; ranksComputed++; if(ranksComputed >= newHighs.size()) setSecondHighs(); return; } high.setRank(arg0.getScore().getRank()); Status status = arg0.getStatus(); int statusCode = status.getStatusCode(); if (statusCode == GamesStatusCodes.STATUS_NETWORK_ERROR_NO_DATA) GameEndOverlay.highsError = true; ranksComputed++; if(ranksComputed >= newHighs.size()) setSecondHighs(); } }); break; case "Fastest Apprentice": Games.Leaderboards.loadCurrentPlayerLeaderboardScore(mGoogleApiClient, getString(R.string.leaderboard_fastest_apprentice), LeaderboardVariant.TIME_SPAN_ALL_TIME, LeaderboardVariant.COLLECTION_PUBLIC).setResultCallback( new ResultCallback<Leaderboards.LoadPlayerScoreResult>() { @Override public void onResult(Leaderboards.LoadPlayerScoreResult arg0) { if(arg0.getScore() == null) { highsError = true; ranksComputed++; if(ranksComputed >= newHighs.size()) setSecondHighs(); return; } high.setRank(arg0.getScore().getRank()); Status status = arg0.getStatus(); int statusCode = status.getStatusCode(); if (statusCode == GamesStatusCodes.STATUS_NETWORK_ERROR_NO_DATA) GameEndOverlay.highsError = true; ranksComputed++; if(ranksComputed >= newHighs.size()) setSecondHighs(); } }); break; } } } 

Метод setSecondHighs

Этот метод отображает ошибку или новые ранги + счет для пользователя

 public void setSecondHighs() { if(highsError) // display an error to the user else // display ranks+score to user } 

Проблема в том, что здесь есть много вызовов API, и представления отображаются в разных точках вызовов. Я знаю, что должен быть лучший способ сделать это. Любая помощь будет принята с благодарностью.

Ура!

Я столкнулся с такой же проблемой, пытаясь увеличить показатели рейтинга лидеров, Google поставил ограничение на количество запросов, которые вы можете сделать в недокументированном / неподтвержденном периоде времени. Обычно три последовательных запроса на получение данных лидеров будут проходить, а остальные будут возвращать связанные с сетью ошибки. Более подробную информацию о других пользователях, сталкивающихся с одной и той же проблемой, можно посмотреть здесь: Android – Google play service: Leaderboard, ограниченное количество запросов