【发布时间】:2016-11-03 03:09:25
【问题描述】:
具体来说,我正在使用 Xamarin.Forms 进行 C# 开发,但是在原生 Android 端编写 GPS 包装器类,该类将通过依赖注入在 Xamarin.Forms 端使用。就 Android 而言,C# 和 Java 之间的调用大部分应该是相同的。
基本上,我在 Android 端的 Geolocator 对象(实现 ILocationListener)中有这个方法:
public async Task<Tuple<bool, string, GPSData>> GetGPSData() {
gpsData = null;
var success = false;
var error = string.Empty;
if (!manager.IsProviderEnabled(LocationManager.GpsProvider)) {
//request permission or location services enabling
//set error
} else {
manager.RequestSingleUpdate(LocationManager.GpsProvider, this, null);
success = true;
}
return new Tuple<bool, string, GPSData>(success, error, gpsData);
}
和
public void OnLocationChanged(Location location) {
gpsData = new GPSData(location.Latitude, location.Longitude);
}
我希望能够调用 GetGPSData 并让它返回元组,目前关于元组唯一重要的是填写 gpsData。我知道找到修复可能需要几秒钟,所以我想要这个方法一旦我真正需要该值,就可以在 Xamarin.Forms 端异步并等待。
我的问题是我无法找到让 manager.RequestSingleUpdate 同步工作的方法,或者任何解决方法。您调用该方法,然后最终 OnLocationChanged 触发。我试着扔了一个恶心的野蛮人
while (gpsData == null);
在调用强制它不继续直到 OnLocationChanged 被触发之后,但是当我将该行放入时,OnLocationChanged 永远不会被调用。我假设这是因为 OnLocationChanged 是在同一个线程上调用的,而不是作为后台线程。
有什么方法可以让我接受这种情况并让 GetGPSData 在 OnLocationChanged 触发之前不返回?
谢谢
编辑:补充一点,这个方法不会被定期调用。这是自发的和罕见的,所以我不想使用 RequestLocationUpdates,获取定期更新并返回最新的更新,因为这需要始终打开 GPS,同时会不必要地耗尽电池。
【问题讨论】:
标签: c# android gps xamarin.android xamarin.forms