2012-04-25 4 views
1

Я использую структуру MvvmCross для разработки кросс-устройств. Когда я тестирую свое приложение в эмуляторе Android (я еще не могу его протестировать на физическом устройстве), я получаю исключение Java.Lang.IllegalArgumentException при вызове RequestLocationUpdates в LocationManager. Кроме того, я не знаю, насколько это актуально, но когда я наводил указатель мыши на оператор, мне сказали, что RequestLocationUpdates - это «Неизвестный метод». Это происходит независимо от того, произошло ли исключение или нет.MonoDroid LocationManager.RequestLocationUpdates дает исключение Java.Lang.IllegalArgumentException

кажется, только произойдет во второй раз я называю это в моем приложении, но код, который очищает его вниз между применениями выглядит, как он должен работать

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. Объект и я подтвердили, что PlatformSpecificStart и Stop и вызываются в соответствующие моменты времени (т.е. Stop определенно вызывается перед вторым запуском). Может ли кто-нибудь сказать мне, что происходит не так?

+0

Я удалось заглянуть ближе и обнаружил, что исключение связано с тем, что «это» является нулевым! Как это может случиться ?! –

+0

У вас есть образец, который вы можете разместить в любом месте? – Stuart

+1

Привет, Стюарт. Я просто попытался ответить на вопрос, но SO не позволит мне, потому что я такой noob! Я могу сделать это через пару часов, когда мне разрешат. –

ответ

1

Я добавил в уроке урок, который показывает используемый интерфейс IMvxGeoLocationWatcher.

Смотрите образец в https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20Tutorial/Tutorial/Tutorial.Core/ViewModels/Lessons/LocationViewModel.cs с кодом как:

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; 
     } 
    } 

Это похоже на работу ОК:

Я еще не написал код для WinRT ...


Одна вещь, которая может быть причиной ваших ошибок, если вы пытаетесь Dispose() экземпляр IMvxGeoLocationWatcher - делать это может привести к unpredicatable результатов ,

При работе с GPS на WM6, iPhone, Bada, WP7 и Android для RunSat/Navmi (http://www.navmi.com) Я часто сталкивался с проблемами, когда родные платформы могут быть довольно «неустойчивыми»/«непредсказуемо», когда приложение запускает/останавливает прослушиватели нескольких мест - и я думаю, что это повлияло на то, как я разработал функциональность IMvxGeoLocationWatcher. В общем случае, если ваше приложение использует IMvxGeoLocationWatcher, тогда я думаю, что лучше всего привязать доступ к местоположению в каком-то одноэлементном доступе через интерфейс - это позволит вам значительно упростить управление функциями местоположения, а не иметь несколько клиентов все индивидуально пытаются запустить/остановить менеджеров местоположений.


Если вы нашли функциональность IMvxGeoLocationWatcher не то, что вы ищете, а затем всеми средствами создать свой собственный интерфейс и свои собственные платформы зависимых реализаций - они могут быть легко впрыскивается в пределах каждого класса нативной установки.

Например, одна вещь, которую вы хотели бы попробовать это интерфейс, используя мобильные расширения Mono, которые доступны для размещения (а также для контактов и для некоторых все большее число других функций тоже)

+0

Привет, Стюарт, еще раз спасибо за исчерпывающий ответ. Ваша догадка была действительно правильной - я вызывал Dispose() на наблюдателя. Экземпляр моего наблюдателя был получен, вызвав GetService, и я не знаю, что каждый раз возвращаю один и тот же экземпляр. Теперь он работает абсолютно нормально :) –

+0

Это однострочное изменение, чтобы сделать наблюдателя доступным ... но я видел проблемы, если вы создаете/распоряжаетесь наблюдателями ... Мне нужно подумать об этом ... Мне, возможно, потребуется добавить соглашение об именовании «singleton» для интерфейса наблюдателя? По крайней мере, мне может понадобиться удалить из него IDisposable-интерфейс! – Stuart

 Смежные вопросы

  • Нет связанных вопросов^_^