2013-04-26 1 views
6

Ich bin eine Position Zuhörers in einem Geolocator Objekt Einstellung mitWindows Phone 8 - Geolocator Position Zuhörer sterben nach einiger Zeit

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

Es funktioniert seit einiger Zeit in Ordnung. Aber nach einiger Zeit ohne Benutzerinteraktion (+ - 4 Stunden) hört es auf, Positionsänderungen zu empfangen, ich denke, weil WP8 es einfach tötet. Dies ist vielleicht von MS gewünscht, aber das ist für mein App-Modell schrecklich.

Was ich getan habe ist, zusätzlich eine PeriodicTask zu setzen und die Position zu senden. Und das läuft ohne Probleme, aber wenn der Benutzer seine Positionen ändert, kann ich es nicht wirklich verfolgen.

Die Frage ist: Gibt es überhaupt, diesen Geolocator ohne die Notwendigkeit der Benutzerinteraktion aufzuwecken? Es kann über die PeriodicTask oder sogar in der PositionChanged sein.

Ich habe bereits versucht, einen neuen Geolocator bereits im PositionChanged-Delegaten zu instanziieren, aber das funktioniert nicht.

Jede Hilfe wird sehr geschätzt. Vielen Dank!

+0

es auch Geschieht, wenn Sie GeoCoordinateWatcher Klasse verwenden, anstatt Geolocator? – anderZubi

+0

@anderZubi Habe das nicht versucht. Es scheint mir, dass MS diese Schnittstelle sowieso ablehnen will, nein? –

+0

Dies ist Teil der .NET-API, während die Geolocator-Klasse Teil der neuen WinPRT-API ist. Ich weiß nichts über die zukünftigen Absichten von Microsoft in Bezug auf Ersteres, aber wenn Sie den Code nicht mit einer Windows Store App teilen, können Sie ihn verwenden. – anderZubi

Antwort

2

Es scheint eine Art von GC zu sein, der die Instanz abtötet/deaktiviert.

versuchen geolocator.addEventListener("statuschanged", onStatusChanged);

und neu starten, um das Objekt zu verwenden, wenn der Status Windows.Devices.Geolocation.PositionStatus.disabled oder Windows.Devices.Geolocation.PositionStatus.notAvailable ist.

siehe Geolocator.StatusChanged | statuschanged event für weitere Details.

Hoffnung half ich

+1

Hallo danke für die Antwort, aber ich habe es schon versucht, und es funktioniert nicht so gut. –

1

Sie ein Timeout in Ihrem GetGeopositionAsync Aufruf spezifizieren? Laut dem letzten Kommentar am Ende von this post behebt dieser Code ein Problem, bei dem der GetGeopositionAsync-Aufruf nicht zurückgegeben wurde. Es kann verwandt sein.

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

Wahrscheinlich Garbage Collector findet es ungenutzt und tötet oder zumindest deaktiviert für Strom sparen.

Die meisten der Hardware-Ressourcen Sie Methode namens

addEventListener 

Es ist ein Weg, um die Ressource zu informieren: „Hey ich möchte Updates erhalten, von Ihnen so nicht sterben“. Und das ist ein sehr häufiges Muster, um Objekte zu beobachten und Updates asynchron zu bekommen.

Werfen Sie einen Blick auf http://en.wikipedia.org/wiki/Observer_pattern