【问题标题】:Google Play Services Saved Game Snapshot crash on readfully()Google Play 服务保存的游戏快照在 readfully() 上崩溃
【发布时间】:2014-10-04 08:32:53
【问题描述】:

我花了几天时间试图从测试人员的设备上找出导致 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 的后台线程上运行,所以在打开快照和尝试在此设备上读/写它之间发生了一些不好的事情。根据测试人员的说法,“大部分”时间都会崩溃。

【问题讨论】:

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


    【解决方案1】:

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

    为了安全起见,我还将 readFully() 包裹在 try/catch 中。

    【讨论】:

    • 很高兴听到。我不久前也解决了我的问题。我现在正在完美地保存和加载!现在开始实施排行榜和成就!
    【解决方案2】:

    我也在努力解决这个问题。我现在正在查看文档,它对函数有这样的说法:readFully()

    读取快照的内容。

    如果此快照不是通过 open(GoogleApiClient, SnapshotMetadata) 打开的,或者如果内容已经通过 commitAndClose(GoogleApiClient, Snapshot, SnapshotMetadataChange) 提交,此方法将抛出异常。

    返回 快照内容的字节数。 投掷 如果读取快照失败,则出现 IOException。

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

    【讨论】:

      猜你喜欢
      • 2019-11-19
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      相关资源
      最近更新 更多