2013-04-26 13 views
6

mam zachodzącego słuchacza PositionChanged w obiekcie Geolocator zWindows Phone 8 - Geolocator PositionChanged słuchacz umiera po jakimś czasie

var geolocator = new Geolocator(); 
geolocator.PositionChanged += Geolocator_PositionChanged; 

To działa dobrze przez jakiś czas. Ale po pewnym czasie bez interakcji użytkownika (+ - 4 godziny) przestaje otrzymywać zmiany pozycji, myślę, że ponieważ WP8 po prostu go zabija. To może być pożądane od ms, ale to jest okropne dla mojego modelu aplikacji.

To, co zrobiłem, to dodatkowo ustawić PeriodicTask i wysłać pozycję. I to działa bez problemów, ale jeśli użytkownik zmieni swoje pozycje, nie jestem w stanie go naprawdę śledzić.

Pytanie brzmi: Czy mimo to można obudzić tego Geolocatora bez interakcji użytkownika? Może to być za pomocą PeriodicTask lub nawet PositionChanged.

Próbowałem już utworzyć nowy Geolocator już wewnątrz delegata PositionChanged, ale to nie działa.

Każda pomoc jest bardzo doceniana. Dziękuję Ci!

+0

Czy zdarza się też, jeśli użyć klasy GeoCoordinateWatcher zamiast Geolocator? – anderZubi

+0

@anderZubi Nie próbowałem tego. Wydaje mi się, że MS chce zrezygnować z tego interfejsu, nie? –

+0

Jest to część API .Net, podczas gdy klasa Geolocator jest częścią nowego interfejsu API WinPRT. Nie wiem o przyszłych intencjach Microsoftu na temat tego pierwszego, ale jeśli nie udostępniasz kodu w aplikacji Windows Store, możesz z niego skorzystać. – anderZubi

Odpowiedz

2

Wydaje się, że jest to rodzaj GC, który zabija/blokuje instancję.

spróbować użyć geolocator.addEventListener("statuschanged", onStatusChanged);

i ponownie przedmiotu, gdy status jest Windows.Devices.Geolocation.PositionStatus.disabled lub Windows.Devices.Geolocation.PositionStatus.notAvailable.

patrz Geolocator.StatusChanged | statuschanged event, aby uzyskać więcej informacji.

nadzieję, że pomogło

+1

Cześć, dziękuję za odpowiedź, ale już próbowałem i to nie działa tak dobrze. –

1

Czy określając limit czasu na rozmowy GetGeopositionAsync? Zgodnie z ostatnim komentarzem na dole this post, ten kod rozwiązuje problem, w wyniku którego połączenie GetGeopositionAsync nie powróciło. To może być powiązane.

public Task GetCurrentPosition() 
{ 

    return Task.Run(() => 
    { 
     if (_geolocator == null) 
     { 
      _geolocator = new Geolocator { DesiredAccuracy = PositionAccuracy.High }; 
     } 

     Geoposition geoposition = null; 

     ManualResetEvent syncEvent = new ManualResetEvent(initialState: false); 

     IAsyncOperation asyncOp = _geolocator.GetGeopositionAsync(); 

     asyncOp.Completed += (asyncInfo, asyncStatus) => 
     { 
      if (asyncStatus == AsyncStatus.Completed) 
      { 
       geoposition = asyncInfo.GetResults(); 
      } 

      syncEvent.Set(); 

     }; 

     syncEvent.WaitOne(); 

     return geoposition.Coordinate; 

    }); 

} 
1

Prawdopodobnie Garbage Collector znajduje go nieużywanego i zabija lub przynajmniej dezaktywuje oszczędzanie energii.

Większość zasobów sprzętowych używasz mieć metodę nazywa

addEventListener 

on sposobem informowania tego zasobu: „Hej, jestem chcesz otrzymywać aktualizacje z ty tak nie umierają”. Jest to bardzo powszechny wzorzec obserwowania obiektów i otrzymywania aktualizacji asynchronicznie.

Spójrz na http://en.wikipedia.org/wiki/Observer_pattern