2017-03-09 2 views
-1

Ich möchte Standortaktualisierungen für eine bestimmte Zeitdauer sammeln und etwas mit den Standorten am Ende tun. Ich verfolge derzeit die Zeit, die in der Methode onLocationChanged verstrichen ist.So sammeln Sie Standortaktualisierungen für die spätere Verarbeitung außerhalb von onLocationChanged

Allerdings möchte ich diese Logik scheiden, weil ich verschiedene Dinge mit den Standorten je nach meinen Bedürfnissen tun möchte. Ich überlegte, dass ich, wenn ich einen neuen Thread für die Registrierung meines Standort-Listeners erstellte, auf den Haupt-Thread warten könnte, bis die Standort-Sammlung fertig ist, um die locations-Liste zu verwenden.

public class LocationUpdates { 
    private LocationProvider mLocationProvider; 
    private Looper mLooper; 

    public List<Location> gatherUpdates(final Context context, 
             final long interval, 
             final long fastInterval, 
             final long duration) 
      throws InterruptedException { 

     long startTime = System.currentTimeMillis(); 

     new Thread() { 
      @Override 
      public void run() { 
       Looper.prepare(); 
       mLooper = Looper.myLooper(); 
       mLocationProvider = new LocationProvider(context); 
       mLocationProvider.startTracking(interval, fastInterval, duration); 
       Looper.loop(); 
      } 
     }.start(); 

     while (System.currentTimeMillis() - startTime < duration) { 

     } 

     mLooper.quit(); 
     mLooper.getThread().join(); 

     return mLocationProvider.locations; 
    } 
} 

Statt dessen, was ich beobachtet (Intervall von 3 Sekunden Dauer 10 Sekunden):

  • die Linie mLocationProvider.startTracking(interval, fastInterval, duration); erreicht ist
  • gatherUpdates kehrt nach wie lange
  • onLocationChanged wird für die angerufene erste Zeit nur jetzt

Also, e Obwohl der Standort-Listener registriert ist, blockiert etwas den Empfang von Updates. Ich kann nicht herausfinden, warum meine Logik nicht das tut, was ich von ihr erwarte.

Gibt es einen Weg, auch ohne einen Thread, um eine Reihe von Standort-Updates zu sammeln und mit ihnen außerhalb von onLocationChanged nur nach der Sammlung zu arbeiten?

+0

Wenn der downvoter freundlich zeigen könnte, was in dieser Frage fehlt, könnte ich möglicherweise es ansprechen. Eine Antwort auf diese Frage interessiert mich immer noch. – Reti43

Antwort

0

Sie könnten Ihre Anforderung für Standortaktualisierungen mit einer Intent an eine BroadcastReceiver erstellen. Entfernen Sie dann die Updates, wenn die Zeit des Standortobjekts Ihre Dauer überschreitet.

int requestCode = 1; 
Intent intent = new Intent(this, LocationReceiver.class); // Request updates to Receiver 
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, requestCode, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, pendingIntent); 

In Ihrem Rundfunkempfänger:

@Override 
public void onReceive(Context context, Intent intent) { 

    if(LocationResult.hasResult(intent)){ 
     LocationResult locResult = LocationResult.extractResult(intent); 
     Location location = locResult.getLocations().get(0); 
     // Check the location's time and maybe stop location updates 
    } 
} 
+0

Ich fürchte, das scheint mir nicht zu helfen. Alles, was Sie zeigen, ist, wie ich meine Standortaktualisierungen an einen BroadcastReceiver weitergeben kann, während ich das bereits mit einem LocationListener machen kann. Mein Problem ist, dass ich eine Methode habe, die Sachen macht, dann einige Standortdaten für eine bestimmte Zeit erhält und sobald das erledigt ist, die Ergebnisse abrufen und weitermachen. Die Frage ist, wie man diese Methode warten lässt, ohne die Updates zu blockieren. – Reti43

+0

@ Reti43 Ich schlug BroadcastReceiver vor, da sie wie auch IntentServices den Standort Intents verarbeiten können, ohne dass Ihre App im Vordergrund steht. Was ich jedoch sagen möchte, ist, dass Sie Updates von überall dort anfordern können, wo der Prozess abgeschlossen ist, die Werte des Standorts in einer Datenbank speichern, die Zeit bei jedem Update prüfen, ob sie Ihren Kriterien entspricht, und wenn nicht, können Sie aufhören Speichern Sie die Daten, entfernen Sie die Aktualisierungen, wenn Sie möchten, und verarbeiten Sie die gespeicherten Daten. Ich würde mich dem nicht nähern, indem ich warte. Ich hätte eine Aufgabe die Vorortbearbeitung und eine andere die Nachortbearbeitung. –

Verwandte Themen