0

In meiner App habe ich eine Service, die Standortaktualisierungen empfängt und sie in einer Datenbank speichert. Ich habe auch eine Fragment, die eine und eine PolyLine aller aufgezeichneten Wegpunkte aus der Datenbank anzeigt.Bessere Methode zum Aktualisieren der PolyLine-Spur von GPS-Messungen

Während der Aufnahme benachrichtigt die Service die Fragment über neue Wegpunkte, so dass die Fragment die PolyLine aktualisieren kann. Das Problem ist, dass, wenn der Benutzer weg von der App navigiert die App die Service Wegpunkte weiterhin auf die Datenbank aufzeichnet, aber jetzt die Fragment nicht aktualisiert wird, da die Fragment pausiert ist. Also in onResume Ich erstelle eine neue PolyLine, lese alle Wegpunkte in der Datenbank und füge sie zur Datenbank hinzu.

Das funktioniert alles gut, aber es fühlt sich nicht wirklich optimal an, um eine neue PolyLine zu erstellen und alle Wegpunkte wieder hinzuzufügen (es könnten Tausende sein!). Ich denke, ich könnte einfach alle neuen Wegpunkte hinzufügen, die nicht bereits in der PolyLine sind, aber ich wollte sehen, ob jemand hier eine alternative Lösung hat? Gibt es eine Möglichkeit, die Fragment "am Leben zu erhalten" und ihre PolyLine zu aktualisieren, selbst wenn die App im Hintergrund ist (solange der Dienst läuft)? Oder gibt es einen besseren Weg, dies zu tun?

Antwort

2

die Polylinie Recreating ist wohl unvermeidlich, aber hier sind einige Dinge, die Sie tun, denken sollte, wenn die Leistung ein Problem wird:

ein Zeitlimit Put. Wenn Sie die Polylinie erneut erstellen, rufen Sie nur die Daten der letzten Stunde oder des letzten Tages ab (testen Sie, und Sie können den besten Wert hier ermitteln) und bieten Sie eine Option zum Erweitern dieses Zeitraums an. Dadurch wird es für den Benutzer verständlicher, dass die Daten einige Zeit zum Laden benötigen und dass die App mehr Ressourcen verwendet.

Aggregieren Sie die Daten, während Sie sie speichern. Dies sollte den Speicherplatz reduzieren, der zum Speichern der Punkte in der Datenbank verwendet wird (sehr wichtig für Low-End-Geräte) und die Leistung beim Neuaufbau der Aktivität verbessern. Dies sind einige Tipps, wie Sie die Anzahl reduzieren können:

  1. Überprüfen Sie 2 Punkte hinter und sehen Sie, ob sie eine gerade Linie sind. Wenn ja, löschen Sie die mittlere. Das sollte eine Menge von Daten entfernen, die aufgezeichnet werden, wenn der Benutzer in einem Auto ist oder eine lange Strecke geht
  2. Überprüfen Sie, ob die letzten Punkte (5 oder mehr) in der gleichen Gegend sind, auf diese Weise können Sie viel loswerden von Dateien. Wenn ein Benutzer nur zu Hause oder am Arbeitsplatz arbeitet, können Sie einfach einen Punkt speichern, ohne zu viele Daten zu verlieren, was in den meisten (99%) der Anwendungen kein Problem darstellen sollte.
+0

Danke, das ist ein guter Rat! Ich mache bereits # 2, wenn ich meinen Location Update Listener registriere (Standard ist 10m Mindestabstand). Die geradlinige Erkennung ist ein netter, nicht sicher, wie man es implementiert - es würde eine Art von Toleranz benötigen ... – BadCash

+0

@BadCash Es gibt ein paar Möglichkeiten, die ich mir vorstellen kann, um das zu erreichen. Der beste, den ich mir vorstellen kann, ist, den Abstand des Mittelpunkts zu der Linie zu berechnen, die von den zwei umgebenden Punkten erzeugt wird, und zu prüfen, ob sie kleiner ist als ein bestimmter Wert, der durch die Fehlergrenze bestimmt wird, die Sie brauchen. –

+0

Nochmals vielen Dank :) Ja, das wäre ein Weg zu gehen. Ich hatte einen anderen Gedanken - was ist, wenn ich die Länge des Pfades von AmB (m = Mittelpunkt) mit der Länge des geraden Pfades AB vergleiche, und wenn der erste innerhalb einer bestimmten Toleranz (länger) als der gerade Pfad ist kann als gerade angesehen werden? – BadCash