1

我正在实现 Xamarin Android 位置跟踪器并添加了以下代码来停止位置更新。

    public Task StopAsync()
    {
        if(IsTracking)
        {
            IsTracking = false;
            perviousStopTask = fusedLocationProviderClient.RemoveLocationUpdatesAsync(this);
        }

        return perviousStopTask;
    }

在上面的方法中,我将任务返回从RemoveLocationUpdatesAsync方法分配给perviousStopTask并从方法返回StopAsync。但是当我尝试等待这种StopAsync方法时,它并没有完成。

4

2 回答 2

1

Xamarin LocationSample 项目将此问题归咎于 Google Play 服务。该示例当前在调用时不使用 await RemoveLocationUpdatesAsync

TODO:我们应该等待这个调用,但 Google Play 服务中似乎存在一个错误,即第一次调用 removeLocationUpdates 时,返回的 Android.Gms.Tasks.Task 从未真正完成,即使位置更新似乎已被删除并停止正在发生。现在,我们将只是开火并忘记作为一种解决方法。

于 2019-04-19T17:49:33.813 回答
0

我不确定 Fused Location Provider 是否是线程安全的。但是,您可以尝试以下一些方法。

  1. 似乎您正在返回 Completed 或nullwhen IsTrackingis false,所以我将方法更改为:

    public Task StopAsync()
    {
        if (IsTracking)
        {
            IsTracking = false;
            return fusedLocationProviderClient.RemoveLocationUpdatesAsync(this);
        }
    
        return Task.CompletedTask;
    }
    
  2. 如果您对返回调用该方法的上下文并不真正感兴趣,请确保调用.ConfigureAwait(false)

    await StopAsync().ConfigureAwait(false);
    
于 2019-03-19T16:11:14.177 回答