我花了几天的时间试图从测试人员的设备中解决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中的后台线程上运行,在打开快照和尝试在此设备上读/写之间发生了一些不好的事情。根据测试人员的说法,最常见的是“崩溃”。当时。
答案 0 :(得分:1)
我最终只通过允许一次异步操作解决了这个问题,因为我以前允许同时保存和加载相同的快照。
我还将readFully()包装在try / catch中以保证安全。
答案 1 :(得分:0)
我也正在研究这个问题。我现在正在查看文档,它有关于函数的说法:readFully()
阅读快照的内容。
如果未通过打开(GoogleApiClient,SnapshotMetadata)打开此快照,或者内容已通过commitAndClose(GoogleApiClient,Snapshot,SnapshotMetadataChange)提交,则此方法将引发异常。
返回 快照内容的字节数。 抛出 如果读取快照失败,则发生IOException。
您确定快照已正确打开并提交吗?