FusedLocationProviderClient RemoveLocationUpdatesAsync任务未完成

时间:2019-03-18 10:50:29

标签: android xamarin xamarin.android task fusedlocationproviderclient

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

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

        return perviousStopTask;
    }

在上述方法中,我将RemoveLocationUpdatesAsync方法的Task返回值分配给perviousStopTask,然后从StopAsync方法返回它。但是,当我尝试等待此StopAsync方法时,它并没有完成。

2 个答案:

答案 0 :(得分:1)

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

  

TODO:我们应该等待此调用,但是在Google Play服务中似乎有一个错误,该错误首次调用removeLocationUpdates时,即使位置更新确实确实完成了,但返回的Android.Gms.Tasks.Task从未真正完成。删除并停止发生。目前,我们只是将其作为解决方法而忘却了。

答案 1 :(得分:0)

我不确定融合位置提供程序是否是线程安全的。但是,您可以尝试以下一些操作。

  1. nullIsTracking时,您似乎正在返回完成的或false,所以我将方法更改为:

    public Task StopAsync()
    {
        if (IsTracking)
        {
            IsTracking = false;
            return fusedLocationProviderClient.RemoveLocationUpdatesAsync(this);
        }
    
        return Task.CompletedTask;
    }
    
  2. 如果您真的不希望返回到从其调用方法的上下文,请确保调用.ConfigureAwait(false)

    await StopAsync().ConfigureAwait(false);