Pracuję nad grą, w której wyniki są przekazywane do tabel wyników w działaniu, a nowe wysokie wyniki są wyświetlane w szeregu w jednym fragmencie. Mam coś (nieco) funkcjonalnego, ale wskaźnik sukcesu wynosi ~ 10%.Przesyłanie wyników do tabel wyników gier Google Play i wyświetlanie nowego rankingu
Przepływ jest następujący:
Method handleLeaders
Metoda ta pobiera aktualne wyniki dla każdej tablicy, a jeżeli nowy wynik jest lepszy, jest złożony i nowy newHigh przedmiot jest tworzony z wynikiem i dodawany do tablicy ArrayList. Po obsłużeniu wszystkich 3 tabel wyników wywoływana jest metoda setHighs. (Błędy są sprawdzone w każdym z połączeń tabeli liderów)
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();
}
});
}
}
metoda setHighs
Ta metoda staje w szeregi każdego odpowiedniego newHigh i zapisuje nową rangę wewnątrz obiektu. Po zebraniu wszystkich rang, wywoływana jest metoda setSecondHighs. (Błędy są sprawdzone w każdym z liderów nazywa)
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;
}
}
}
metoda setSecondHighs
ten sposób albo wyświetla błąd lub nowe szeregi + słabo użytkownikowi
public void setSecondHighs() {
if(highsError)
// display an error to the user
else
// display ranks+score to user
}
Emisja jest to, że istnieje wiele połączeń API tutaj, a zgłoszenia są zawieszane w różnych punktach połączeń. Wiem, że musi być lepszy sposób na zrobienie tego. Każda pomoc będzie wielce ceniona.
Pozdrawiam!
Wygląda na to, że wdrażasz znacznie więcej rzeczy o niskim poziomie, niż zwykle robię przy pracy z tabelami wyników. submitScore() jest ogniem i zapomnij zgodnie z dokumentami. Jeśli masz problem z używaniem tej formy interfejsu API, spójrz na submitScoreImmediate(). Zauważyłem, że pod maską, używając submitScore(), GoogleApiClient czasami przechowuje zapisy i przesyła je jako Scores.submitMultiple(). – JimENewtron
wskaźnik sukcesu wynosi ~ 10% <- masz na myśli to, że możesz opublikować swój log.d i powiedzieć trochę więcej o tym, jak to, czego oczekujesz, porównuje z wynikami, które obserwujesz? – kpie
Po zakończeniu debugowania wiele wywołań onResult zwraca zerowy obiekt LoadPlayerScoreResult, bez względu na moje połączenie internetowe. To nie jest za każdym razem. Czasem jest nieważny, czasami nie. Ten problem występuje zwykle w metodzie setHighs, ale czasami zdarza się, że jest to metoda handleLeaders – Brandacus