2016-05-26 2 views
7

У меня есть следующий код:Играть разрешение игры Снимок конфликта дает конфликт

Snapshots.OpenSnapshotResult result; 
result = Games.Snapshots.open(googleApiClient, "save", true).await(); 
while (result == null || !result.getStatus().isSuccess()) { 
    Log.d("Snapshot", "Open snapshot"); 
    if (result.getStatus().getStatusCode() == GamesStatusCodes.STATUS_SNAPSHOT_CONFLICT) { 
     Snapshot snapshot = result.getSnapshot(); 
     Snapshot conflictSnapshot = result.getConflictingSnapshot(); 

     // Resolve between conflicts by selecting the newest of the conflicting snapshots. 
     Snapshot mResolvedSnapshot = snapshot; 

     if (snapshot.getMetadata().getLastModifiedTimestamp() < 
       conflictSnapshot.getMetadata().getLastModifiedTimestamp()) { 
      mResolvedSnapshot = conflictSnapshot; 
     } 

     result = Games.Snapshots.resolveConflict(
       googleApiClient, result.getConflictId(), mResolvedSnapshot).await(); 
    } 
} 

Однако этот код продолжает застревать в то время цикла. result продолжает иметь статус STATUS_SNAPSHOT_CONFLICT. Любые идеи относительно того, почему это не разрешается?

ответ

5

В зависимости от того, сколько совершений произошло между двумя версиями, вам может потребоваться разрешить несколько конфликтов в этом цикле. Он должен в конечном итоге stop :) Это может занять очень долго.

Для получения более подробной информации см: https://developers.google.com/games/services/android/savedgames#handling_saved_game_conflicts

// Some large number to be defensive against an infinite loop. 
static final int MAX_SNAPSHOT_RESOLVE_RETRIES = 100; 

Snapshots.OpenSnapshotResult result; 
result = Games.Snapshots.open(googleApiClient, "save", true).await(); 

Snapshot snapshot = processSnapshotOpenResult(result, int retryCount); 


Snapshot processSnapshotOpenResult(Snapshots.OpenSnapshotResult result, int retryCount) { 
    Snapshot mResolvedSnapshot = null; 
    retryCount++; 

    int status = result.getStatus().getStatusCode(); 
    Log.i(TAG, "Save Result status: " + status); 

    if (status == GamesStatusCodes.STATUS_OK) { 
     return result.getSnapshot(); 
    } else if (status == GamesStatusCodes.STATUS_SNAPSHOT_CONTENTS_UNAVAILABLE) { 
     return result.getSnapshot(); 
    } else if (status == GamesStatusCodes.STATUS_SNAPSHOT_CONFLICT) { 
     Snapshot snapshot = result.getSnapshot(); 
     Snapshot conflictSnapshot = result.getConflictingSnapshot(); 

     // Resolve between conflicts by selecting the newest of the conflicting snapshots. 
     mResolvedSnapshot = snapshot; 

     if (snapshot.getMetadata().getLastModifiedTimestamp() < 
       conflictSnapshot.getMetadata().getLastModifiedTimestamp()) { 
      mResolvedSnapshot = conflictSnapshot; 
     } 

     Snapshots.OpenSnapshotResult resolveResult = Games.Snapshots.resolveConflict(
       mGoogleApiClient, result.getConflictId(), mResolvedSnapshot).await(); 

     if (retryCount < MAX_SNAPSHOT_RESOLVE_RETRIES) { 
      // Recursively attempt again 
      return processSnapshotOpenResult(resolveResult, retryCount); 
     } else { 
      // Failed, log error and show Toast to the user 
      String message = "Could not resolve snapshot conflicts"; 
      Log.e(TAG, message); 
      Toast.makeText(getBaseContext(), message, Toast.LENGTH_LONG).show(); 
     } 

    } 

    // Fail, return null. 
    return null; 
} 
+0

Дело в том, что это не так. –

+0

Сколько итераций он сделал? Можете ли вы поделиться журналом? –

+0

Хорошо, ничего себе. Теперь это произошло. Мой телефон просто пролежал там более 30 минут, поэтому я догадываюсь о 100 итерациях. –

1

Там ошибка в Google Play Services приложение, которое очевидно необходимо несколько исправлений. Пожалуйста, ознакомьтесь с этим обсуждением, в котором участвует Google: GitHub discussion and fix info

Смежные вопросы