2014-10-04 98 views
0

我花了數天的時間嘗試從測試人員的設備中找出Google Play服務保存的遊戲代碼中發生崩潰的原因,並且不知道還有什麼可以嘗試的在我所有的三個設備上。發生崩潰的是:Google Play服務已保存的遊戲快照崩潰()

java.lang.NullPointerException: Must provide a previously opened Snapshot 

當我嘗試打電話

snapshot.readFully(); 

即使快照已經開通,並返回代碼進行覈對,並檢查,看它是否爲空。下面是代碼通往崩潰的原因,與簡潔,刪除非執行部分:

public void LoadSnapshot() 
{ 
    AsyncTask<Void, Void, SNAPSHOT_ASYNC_RESULT> task = new AsyncTask<Void, Void, SNAPSHOT_ASYNC_RESULT>() 
    { 
     @Override 
     protected SNAPSHOT_ASYNC_RESULT doInBackground(Void... params) 
     { 
      if (isSignedIn()) 
      { 
       Snapshots.OpenSnapshotResult result = Games.Snapshots.open(getApiClient(), "MySnapshot", true).await(); 
       int status = result.getStatus().getStatusCode(); 
       DebugLog("Snapshot Load Open result code: " + status); 

       if (status == GamesStatusCodes.STATUS_SNAPSHOT_CONFLICT) 
       { 
        Snapshot snapshot   = result.getSnapshot(); 
        Snapshot conflictSnapshot = result.getConflictingSnapshot(); 

        //write both conflicted files so we can merge them 
        if (snapshot != null && conflictSnapshot != null) 
        { 
         byte[] ssdata = snapshot.readFully();  //CRASH HERE! 

         ... 

        } 

        ... 
       } 
      } 
     } 
    } 

    task.execute(); 
} 

我得到的時候只需用後跟.writebytes。開()有時會保存在同一臺設備發生類似事故() 。

它使整個遊戲變得不穩定,我需要以某種方式解決這個問題。任何幫助或想法將不勝感激。

我所能想到的是,因爲它在AsyncTask的後臺線程上運行,所以在打開快照和嘗試在此設備上讀/寫它之間發生了不利的事情。根據測試者崩潰是最「最」的時間。

回答

1

我最終通過只允許一次Async操作解決了這個問題,因爲我之前允許同時保存並加載相同的快照。

爲了安全,我還在try/catch中包裝了readFully()。

+0

好聽。我不久前解決了我的問題。我現在保存和加載完美!現在開始實施排行榜和成就! – Scumble373 2014-12-02 23:23:36

0

我正在爲此工作。我正在查看文檔,它有這樣的功能:readFully()

閱讀快照的內容。

如果未通過打開(GoogleApiClient,SnapshotMetadata)打開此快照,或者如果內容已通過commitAndClose(GoogleApiClient,Snapshot,SnapshotMetadataChange)提交,則此方法將引發異常。

返回 快照內容的字節。 拋出 如果讀取快照失敗,則發生IOException。

您確定快照已被打開並正確提交嗎?

+0

請參閱我的答案以下我的工作解決方案。 – DJPJ 2014-11-27 08:23:25

相關問題