Xamarin.android MonoDroid LocationManager.RequestLocationUpdates提供Java.Lang.IllegalArgumentException异常
我正在使用MvvmCross框架进行跨设备开发。当我在Android emulator中测试我的应用程序时(我还不能在物理设备上测试它),在LocationManager上调用RequestLocationUpdate时,我会得到一个Java.Lang.IllegalArgumentException异常。另外,我不知道它是否相关,但当我将鼠标悬停在语句上时,我被告知RequestLocationUpdates是一个“未知方法”。无论异常是否发生,都会发生这种情况 这似乎只发生在我在应用程序中第二次调用它时,但是在使用之间清除它的代码看起来应该可以工作Xamarin.android MonoDroid LocationManager.RequestLocationUpdates提供Java.Lang.IllegalArgumentException异常,xamarin.android,mvvmcross,Xamarin.android,Mvvmcross,我正在使用MvvmCross框架进行跨设备开发。当我在Android emulator中测试我的应用程序时(我还不能在物理设备上测试它),在LocationManager上调用RequestLocationUpdate时,我会得到一个Java.Lang.IllegalArgumentException异常。另外,我不知道它是否相关,但当我将鼠标悬停在语句上时,我被告知RequestLocationUpdates是一个“未知方法”。无论异常是否发生,都会发生这种情况 这似乎只发生在我在应用程序中第
protected override void PlatformSpecificStart(MvxGeoLocationOptions options)
{
if (_locationManager != null)
throw new MvxException("You cannot start the MvxLocation service more than once");
_locationManager = (LocationManager)Context.GetSystemService(Context.LocationService);
var criteria = new Criteria() { Accuracy = options.EnableHighAccuracy ? Accuracy.Fine : Accuracy.Coarse };
var bestProvider = _locationManager.GetBestProvider(criteria, true);
_locationManager.RequestLocationUpdates(bestProvider, 5000, 2, this);
}
protected override void PlatformSpecificStop()
{
EnsureStopped();
}
private void EnsureStopped()
{
if (_locationManager != null)
{
_locationManager.RemoveUpdates(this);
_locationManager = null;
}
}
这个类继承自Java.Lang.Object,我已经验证了PlatformSpecificStart和Stop,并在适当的时间调用了它(也就是说,Stop肯定是在第二次启动之前调用的)。有人能告诉我出了什么问题吗?我在教程中添加了一节课,展示了使用的
IMvxGeoLocationWatcher
接口
请参见中的示例,代码如下:
private void DoStartStop()
{
if (!IsStarted)
{
_watcher.Start(new MvxGeoLocationOptions() { EnableHighAccuracy = true }, OnNewLocation, OnError);
}
else
{
_watcher.Stop();
}
IsStarted = !IsStarted;
}
private void OnError(MvxLocationError error)
{
// TODO - shuold handle the error better than this really!
LastError = error.Code.ToString();
}
private void OnNewLocation(MvxGeoLocation location)
{
if (location != null && location.Coordinates != null)
{
Lat = location.Coordinates.Latitude;
Lng = location.Coordinates.Longitude;
}
}
这似乎可以在以下方面发挥作用:
- WP7-
- 机器人-
- 触摸-
可能导致错误的一个原因是,如果您尝试处置()IMvxGeoLocationWatcher实例,那么这样做可能会导致无法预测的结果 在WM6、iPhone、Bada、WP7和Android上处理RunSat/Navmi的GPS时(http://www.navmi.com)我经常遇到这样的问题:当应用程序启动/停止多个位置侦听器时,本机平台可能非常“不稳定”/“不可预测”——我认为这确实影响了我设计
IMvxGeoLocationWatcher
功能的方式。一般来说,如果您的应用程序使用IMvxGeoLocationWatcher
,那么我认为最好将对位置的访问封装在通过接口访问的某种单例中-这样做可以让您更轻松地控制位置功能,而不是让多个客户端都单独尝试启动/停止位置管理器
如果您发现
IMvxGeoLocationWatcher
的功能不是您想要的,那么请务必创建您自己的接口和您自己的平台相关实现-它们可以轻松地注入到每个本机安装类中
例如,您可能想尝试的一件事是使用Mono mobile extensions的界面,该界面可用于定位(以及联系人和越来越多的其他功能)我在教程中添加了一节课,展示了使用的
IMvxGeoLocationWatcher
界面
请参见中的示例,代码如下:
private void DoStartStop()
{
if (!IsStarted)
{
_watcher.Start(new MvxGeoLocationOptions() { EnableHighAccuracy = true }, OnNewLocation, OnError);
}
else
{
_watcher.Stop();
}
IsStarted = !IsStarted;
}
private void OnError(MvxLocationError error)
{
// TODO - shuold handle the error better than this really!
LastError = error.Code.ToString();
}
private void OnNewLocation(MvxGeoLocation location)
{
if (location != null && location.Coordinates != null)
{
Lat = location.Coordinates.Latitude;
Lng = location.Coordinates.Longitude;
}
}
这似乎可以在以下方面发挥作用:
- WP7-
- 机器人-
- 触摸-
可能导致错误的一个原因是,如果您尝试处置()IMvxGeoLocationWatcher实例,那么这样做可能会导致无法预测的结果 在WM6、iPhone、Bada、WP7和Android上处理RunSat/Navmi的GPS时(http://www.navmi.com)我经常遇到这样的问题:当应用程序启动/停止多个位置侦听器时,本机平台可能非常“不稳定”/“不可预测”——我认为这确实影响了我设计
IMvxGeoLocationWatcher
功能的方式。一般来说,如果您的应用程序使用IMvxGeoLocationWatcher
,那么我认为最好将对位置的访问封装在通过接口访问的某种单例中-这样做可以让您更轻松地控制位置功能,而不是让多个客户端都单独尝试启动/停止位置管理器
如果您发现
IMvxGeoLocationWatcher
的功能不是您想要的,那么请务必创建您自己的接口和您自己的平台相关实现-它们可以轻松地注入到每个本机安装类中
例如,您可能想尝试的一件事是使用Mono mobile extensions的接口,该接口可用于定位(以及联系人和其他越来越多的功能)我仔细查看了一下,发现异常是由于“this”为空!怎么会这样?!你有可以在任何地方发布的样本吗?嗨,斯图尔特-我刚刚试着回答这个问题,但所以不让我,因为我是个笨蛋!如果允许的话,我可以在几个小时内完成。我已经仔细查看了一下,发现异常是由于“this”为空!怎么会这样?!你有可以在任何地方发布的样本吗?嗨,斯图尔特-我刚刚试着回答这个问题,但所以不让我,因为我是个笨蛋!如果允许的话,我可以在几个小时内完成。嗨,斯图尔特,再次感谢你的全面回答。你的猜测确实是对的——我在给watcher打Dispose()。我的watcher实例是通过调用GetService获得的,我不知道每次都返回相同的实例。它的工作绝对好:)这是一个单行线的变化,使观察者一次性。。。但是如果你创建/处理观察者,我看到了一些问题。。。我需要考虑一下这个。。。我可能需要向watcher接口添加一个“单例”命名约定?至少,我可能需要从中删除IDisposable接口!嗨,斯图尔特,再次感谢你的全面回答。你的猜测确实是对的——我在给watcher打Dispose()。我的watcher实例是通过调用GetService获得的,我不知道每次都返回相同的实例。它的工作绝对好:)这是一个单行线的变化,使观察者一次性。。。但是如果你创建/处理观察者,我看到了一些问题。。。我需要考虑一下