MVVMCross IMvxGeoLocationWatcher Success Action никогда не срабатывает на Android

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

Вот код моей ViewModel:

namespace LoginProductsMVVM.Core.ViewModels
{
    public class ProductDetailViewModel
        : MvxViewModel
    {
        public void Init(Product product)
        {
            Product = product;
        }

        private Product _product;
        public Product Product
        {
            get { return _product; }
            set { _product = value;
                RaisePropertyChanged (() => Product); }
        }

        private string _latitude;
        public string Latitude{
            get { return _latitude; }
            set { _latitude = value; RaisePropertyChanged(() => Latitude); }
        }

        private string _longitude;
        public string Longitude{
            get { return _longitude; }
            set { _longitude = value; RaisePropertyChanged(() => Longitude); }
        }

        private string _address;
        public string Address{
            get { return _address; }
            set { _address = value; RaisePropertyChanged(() => Address); }
        }

        private IMvxGeoLocationWatcher _watcher;
        public IMvxGeoLocationWatcher Watcher
        {
            get 
            {
                _watcher = Mvx.Resolve<IMvxGeoLocationWatcher> ();
                return _watcher;
            }
        }

        public ProductDetailViewModel(IMvxGeoLocationWatcher watcher)
        {
            _watcher = watcher;
            _watcher.Start (new MvxGeoLocationOptions (), OnLocation, OnError);
        }

        void OnLocation (MvxGeoLocation location)
        {
            Latitude = location.Coordinates.Latitude.ToString();
            Longitude = location.Coordinates.Longitude.ToString();

            // Android Location specific stuff
            var activity = Mvx.Resolve<IMvxAndroidCurrentTopActivity> ().Activity;
            Geocoder geocdr = new Geocoder (activity.BaseContext);

            IList<Address> addresses = geocdr.GetFromLocation (double.Parse(Latitude), double.Parse(Longitude), 1);

            addresses.ToList().ForEach ((addr) => Address += addr.ToString() + "\r\n\r\n");
        }

        void OnError (MvxLocationError error)
        {
            Mvx.Error ("Seen location error {0}", error);
        }
    }
}

У меня есть точка останова в моем методе OnLocation, но она никогда не попадает туда. Я что-то упустил, чтобы это правильно работало на Android? Кажется, он отлично работает для iOS...


person PkL728    schedule 17.07.2013    source источник


Ответы (2)


Согласно Одахану здесь:

Что ж... Я исследовал немного больше: проблема известна и проявляется на многих устройствах. Это не проблема MvvmCross. Краткий ответ: устройство необходимо перезагрузить, и все работает как часы... Кажется, Google прислал некоторые обновления, которые вызывают проблему. Вот поток, говорящий об этой проблеме и аналогичной проблеме, касающейся класса GeoCode:

https://code.google.com/p/android/issues/detail?id=38009

Итак: можно закрыть, MvvmCross в порядке, но другие могут столкнуться с этой ошибкой, поэтому мои объяснения и ссылка здесь.

person PkL728    schedule 23.07.2013

Когда вы говорите, что это никогда не приводит к «успеху», действительно ли успех случается?

В коде GPS может быть много ошибок — например, ваше приложение может не иметь привилегий, на вашем телефоне может быть отключен A-GPS или GPS, или вы даже можете работать на эмуляторе без определения местоположения — все это возможно. из вашего описания.

Также стоит отметить, что Xamarin.Android имеет давние проблемы с достижением точек останова, поэтому лучше добавить трассировку, чем полагаться на достижение точки останова:/


Возможно, попробуйте запустить через N=8 с http://mvvmcross.wordpress.com/ - поможет ли это вообще? ? (N=9 также стоит посмотреть, так как он показывает один из способов разрешить нескольким моделям просмотра использовать geowatcher)

person Stuart    schedule 17.07.2013
comment
Успех никогда не происходит (или, по крайней мере, я в это не верю), потому что он никогда не достигает моей точки останова и никогда не обновляет мои широту и долготу. Я работаю на физическом устройстве, на котором включено определение местоположения. Я включил следующие разрешения: AccessCoarseLocation, AccessNetworkState, Internet. Мне нужно проверить и посмотреть, работает ли N = 8 на устройстве! - person PkL728; 17.07.2013
comment
перекрестная ссылка на github.com/slodge/MvvmCross/issues/360 - странно, что 2 человека видят одну и ту же проблему в один и тот же день, но я могу подтвердить, что код по-прежнему работает на моем эмуляторе и на моих тестовых устройствах, поэтому кажется, что ваш опыт, вероятно, связан с некоторыми различиями устройств Android. - person Stuart; 17.07.2013