Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin Geolocation.GetLastKnownLocationAsync()有时返回null_Xamarin_Xamarin.essentials - Fatal编程技术网

Xamarin Geolocation.GetLastKnownLocationAsync()有时返回null

Xamarin Geolocation.GetLastKnownLocationAsync()有时返回null,xamarin,xamarin.essentials,Xamarin,Xamarin.essentials,这是iPhone 6s上的iOS 12.1.4版本。通常Geolocation.GetLastKnownLocationAsync()可以工作,但有时不行。这是完全相同的代码,但如果我坐在这里反复按下“获取纬度和经度”按钮,最终Geolocation.GetLastKnownLocationAsync()会弹出一个空值 你知道为什么会发生这种情况,我会怎么处理吗?也许把它放在一个循环中,尝试十次,每次尝试之间等待一秒钟 var location = await Essentials.Geoloc

这是iPhone 6s上的iOS 12.1.4版本。通常
Geolocation.GetLastKnownLocationAsync()
可以工作,但有时不行。这是完全相同的代码,但如果我坐在这里反复按下“获取纬度和经度”按钮,最终
Geolocation.GetLastKnownLocationAsync()
会弹出一个空值

你知道为什么会发生这种情况,我会怎么处理吗?也许把它放在一个循环中,尝试十次,每次尝试之间等待一秒钟

var location = await Essentials.Geolocation.GetLastKnownLocationAsync(); // works most of the time but sometimes it doesn't work.

这是我建议的工作:

Essentials.Location location = null;
for(var i = 0; i < 10; i++)
{
    location = await Essentials.Geolocation.GetLastKnownLocationAsync();
    if(location == null)
    {
        Thread.Sleep(1000);
    }
    else
    {
        break;
    }
}
Essentials.Location=null;
对于(变量i=0;i<10;i++)
{
location=await Essentials.Geolocation.GetLastKnownLocationAsync();
if(位置==null)
{
睡眠(1000);
}
其他的
{
打破
}
}

首先,在挂起运行循环时使用
线程.Sleep
(除非您不在主/UI循环上)是一种非常糟糕的做法,如果您确实需要延迟,请使用
等待任务。延迟(…
。另外,iOS上的
CLLocationManager
正在主循环上运行,如果您阻止它,则消息泵将挂起,位置管理器无法向应用程序报告

“垃圾邮件”CLLocationManager。由于操作系统速率限制更新(主要是电池节约措施),位置(Essentials在iOS上使用的位置)可能(并且将)导致空返回如果操作系统正在为GPS无线电通电以更新其位置,此方法将从操作系统超时,从而将
nil
报告回
GetLastKnownLocationAsync
,从而返回
null

CLLocationManager.iOS上的Location
用于从操作系统到应用程序的快速低功耗返回,在应用程序启动、设备重新启动等时更新。并非每次调用它

您可以通过调用GetLastKnownLocationAsync方法获取设备的最后一个已知位置。这通常比执行完整查询更快,但精确度可能更低

否则,您应该使用
GetLocationAsync
,以便对GPS进行完全通电,以获得更新的准确位置

要查询当前设备的位置坐标,可以使用GetLocationAsync。最好传入完整的GeolocationRequest和CancellationToken,因为获取设备的位置可能需要一些时间

通常,我建议使用
GetLastKnownLocationAsync
作为一种快速方法,让用户知道这可能也会返回
null
。然后继续执行
GetLocationAsync
(同时传递GeolocationRequest和CancellationToken实例)在后台,并根据更准确和最新的位置相应地更新应用程序


回复:

再次感谢您@sushingover