【发布时间】:2021-09-23 23:34:16
【问题描述】:
我正在使用 Unity 2020.3.4 和 ARCore 4.0.12 以及 Azure Spatial Anchors 2.8.1 创建一个应用程序。它是适用于 Android 和 iOS 的跨平台应用程序。首先,我创建了一个 iOS 版本,在其中创建了一个 Task.Run(async() =>{ }); void 函数中的 lambda 表达式,以便能够调用 Azure 空间锚的异步函数。我是这样做的,因为这个函数是在按下 Unity 按钮时调用的,它不需要异步任务,但它确实需要 void。这在 iOS 设备上运行良好,但在我在 Android 设备上测试后,此代码使应用程序崩溃。
//Called on Unity UI button press, works fine on IOS, but crashes the app on Android
public void BROKENStartLookingForAnchor()
{
Task.Run(async () =>
{
if (!hasStartedOnce)
{
await StorageManager.instance.InitializeStorage();
anchorId = await StorageManager.instance.DownloadBlob(blobName);
}
spatialAnchorManager.SessionStarted += OnSessionStarted;
spatialAnchorManager.AnchorLocated += CloudManager_AnchorLocated;
anchorLocateCriteria = new AnchorLocateCriteria();
if (spatialAnchorManager.Session == null)
{
await spatialAnchorManager.CreateSessionAsync();
SetAnchorLocateCriteria();
}
await spatialAnchorManager.StartSessionAsync();
});
}
一开始很难找出问题所在(我使用 LogCat 进行调试),但是一旦我将代码更改为以下代码,它在 Android 上也能正常工作。
//Called on Unity UI button press, because cannot call async Task from Unity button press
public async void StartLookingForAnchor()
{
await StartLookingForAnchorAsync();
}
private async Task StartLookingForAnchorAsync()
{
if (!hasStartedOnce)
{
await StorageManager.instance.InitializeStorage();
anchorId = await StorageManager.instance.DownloadBlob(blobName);
}
spatialAnchorManager.SessionStarted += OnSessionStarted;
spatialAnchorManager.AnchorLocated += CloudManager_AnchorLocated;
anchorLocateCriteria = new AnchorLocateCriteria();
if (spatialAnchorManager.Session == null)
{
await spatialAnchorManager.CreateSessionAsync();
SetAnchorLocateCriteria();
}
await spatialAnchorManager.StartSessionAsync();
}
但是,即使我解决了这个问题,我仍然不确定为什么第一个选项在 Android 上不起作用,以及为什么第二个可以,因为我对异步函数和多线程不是很熟悉。谁能给我解释一下?
【问题讨论】: