Google Play服务保存的游戏快照在readfully()上崩溃

时间:2014-10-04 08:32:54

标签: android google-play-services google-play-games

我花了几天的时间试图从测试人员的设备中解决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();
} 

我有时会使用.open()后跟.writebytes()来保存来自同一设备的类似崩溃。

它使整个游戏变得不稳定,我需要以某种方式解决这个问题。任何帮助或想法将不胜感激。

我能想到的是,因为它在AsyncTask中的后台线程上运行,在打开快照和尝试在此设备上读/写之间发生了一些不好的事情。根据测试人员的说法,最常见的是“崩溃”。当时。

2 个答案:

答案 0 :(得分:1)

我最终只通过允许一次异步操作解决了这个问题,因为我以前允许同时保存和加载相同的快照。

我还将readFully()包装在try / catch中以保证安全。

答案 1 :(得分:0)

我也正在研究这个问题。我现在正在查看文档,它有关于函数的说法:readFully()

阅读快照的内容。

如果未通过打开(GoogleApiClient,SnapshotMetadata)打开此快照,或者内容已通过commitAndClose(GoogleApiClient,Snapshot,SnapshotMetadataChange)提交,则此方法将引发异常。

返回 快照内容的字节数。 抛出 如果读取快照失败,则发生IOException。

您确定快照已正确打开并提交吗?