Xamarin.android MonoDroid LocationManager.RequestLocationUpdates提供Java.Lang.IllegalArgumentException异常

Xamarin.android MonoDroid LocationManager.RequestLocationUpdates提供Java.Lang.IllegalArgumentException异常,xamarin.android,mvvmcross,Xamarin.android,Mvvmcross,我正在使用MvvmCross框架进行跨设备开发。当我在Android emulator中测试我的应用程序时(我还不能在物理设备上测试它),在LocationManager上调用RequestLocationUpdate时,我会得到一个Java.Lang.IllegalArgumentException异常。另外,我不知道它是否相关,但当我将鼠标悬停在语句上时,我被告知RequestLocationUpdates是一个“未知方法”。无论异常是否发生,都会发生这种情况 这似乎只发生在我在应用程序中第

我正在使用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-
  • 机器人-
  • 触摸-
我还没有为WinRT编写代码


可能导致错误的一个原因是,如果您尝试处置()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-
  • 机器人-
  • 触摸-
我还没有为WinRT编写代码


可能导致错误的一个原因是,如果您尝试处置()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获得的,我不知道每次都返回相同的实例。它的工作绝对好:)这是一个单行线的变化,使观察者一次性。。。但是如果你创建/处理观察者,我看到了一些问题。。。我需要考虑一下