2016-05-26 21 views
7

Tôi đã có đoạn mã sau:Chơi Games Snapshot giải quyết xung đột mang đến cho cuộc xung đột

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(); 
    } 
} 

Tuy nhiên, mã này tiếp tục bị mắc kẹt trong vòng lặp while. result giữ trạng thái STATUS_SNAPSHOT_CONFLICT. Bất kỳ ý tưởng nào về lý do tại sao điều này không được giải quyết?

Trả lời

5

Tùy thuộc vào số lần commit đã xảy ra giữa hai phiên bản, bạn có thể cần giải quyết nhiều xung đột trong vòng lặp đó. Nó nên cuối cùng dừng :) Điều này có thể mất nghiêm trọng lâu mặc dù.

Để biết thêm chi tiết xem: 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

Vấn đề là không. –

+0

Đã bao nhiêu lần lặp lại? Bạn có thể chia sẻ nhật ký không? –

+0

Được rồi, wow. Bây giờ nó đã làm. Điện thoại của tôi chỉ được đặt ở đó trong hơn 30 phút, vì vậy tôi đoán khoảng 100 lần lặp lại. –

1

Có một lỗi trong dịch vụ Google Play ứng dụng rõ ràng mà cần nhiều bản sửa lỗi. Vui lòng xem thảo luận này mà Google tham gia: GitHub discussion and fix info

Các vấn đề liên quan