[Kotlin / AndroidStudio] - Konstante GPS-Updates

M3llo

Cadet 4th Year
Registriert
Mai 2017
Beiträge
107
Moin zusammen,

ich bin ziemlich neu bei AndroidStudio und versuche aktuell eine Android App mit Kotlin zu bauen, die nach Drücken eines Buttons alle 5 Sek die aktuelle GPS-Position (Breiten-/Längengrad) ausgibt und das so lange, bis ein anderer Button zum beenden gedrückt wurde.

Im ersten Schritt habe ich es hinbekommen, dass mir bei Knopfdruck die letzte GPS-Position ausgegeben wird. Das ist sicherlich nicht die eleganteste Lösung auf der Welt aber hey es funktioniert immerhin ;) Jetzt würde ich das ganze gerne um den "Loop" erweitern. Leider weiß ich da nicht wirklich wo ich anfangen soll.

So wie ich das verstanden habe muss ich die Funktion, damit der Rest der App responsive bleibt und ich den Beenden-Knopf auch drücken kann, in einen anderen Thread auslagern. Hierzu hab ich oft die Begriffe Looper und Handler aber auch Coroutines gehört.

Vielleicht kann mir hier ja jemand sagen, wie ich am Besten weiter machen sollte. Vielen Dank auf jeden Fall im Voraus für jeden hilfreichen Tipp ^.^
 
Zuletzt bearbeitet:
Vielen Dank für deine Antwort! Das mit dem deutschen wird uns leider so in der Uni eingetrichtert, finde ich selbst auch schrecklich :D

Meine Frage war wirklich blöd bzw. kaum formuliert :freak: Im Endeffekt ging es mir darum, wie ich am Besten den Prozess in einem ewigen Loop ausgelagert bekomme, weil ich da von den ganzen Möglichkeiten echt erschlagen war.

Ich hatte da wie gesagt super viel von Looper und Handler bei Android Studio gelesen aber da nur alte Java Syntax für gefunden. Habe da gestern ewig rumprobiert und nichts hat so wirklich geklappt. Das Prinzip fand ich aber recht verständlich (sofern ich es richtig verstanden habe): Der Looper hält einen Thread einfach ewig am Leben und arbeitet Aufgaben in einer MessageQueue ab. Der Handler ist dafür da Aufgaben vom Main Thread in diese Message Queue zu bekommen.

Das mit den Coroutines habe ich leider noch nicht ganz verstanden aber der andere Link hat mir auf jeden Fall sehr geholfen! Wenn ich mich nicht täusche sollte mein Programm jetzt genau so handeln wie gewünscht:

Klick auf Starten -> Es wird die aktuelle Position alle 5 Sekunden angezeigt
Klick auf Stoppen -> Der Loop wird abgebrochen
Erneuter Klick auf Starten -> Es geht weiter, ohne, dass das Programm abbricht o.Ä.

Sicherlich alles andere als schön aber bin trotzdem etwas stolz ^^
 
Zuletzt bearbeitet:
Warum nutzt du nicht einfach die dafür vorgesehenen APIs? Dafür brauchst du nichtmal besondere Kenntnisse von Concurrency Frameworks.

public abstract Task<Void> requestLocationUpdates (LocationRequest request, LocationCallback callback, Looper looper)
Requests location updates with the given request and results delivered to the given callback on the specified Looper.
In dem LocationRequest Parameter kannst du zB das Intervall definieren.

Hier gibts auch ein genaues Beispiel in der Android Dokumentation: Request location updates > Make a location request
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: DefconDev
G00fY schrieb:
Warum nutzt du nicht einfach die dafür vorgesehenen APIs? Dafür brauchst du nichtmal besondere Kenntnisse von Concurrency Frameworks.
Ich hab auf meiner Suche die andere Herangehensweise einfach eher gefunden und auch (zumindest vom Prinzip) besser verstanden, deshalb hab ich mich darauf konzentriert. Am Ende hab ich das jetzt auch echt solide zum Laufen bekommen in meiner App ^^'

Meine App ist aber nur ein Teil vom Großen Ganzen. Wir arbeiten da als kleine Projektgruppe aktuell dran. Ein anderer der an der Kommunikation mit einem Server arbeitet hat eine Prototyp Hülle gemacht und aktuell versuche ich mein Projekt dort zu integrieren:



GPSPosition ist meine Klasse und in MainActivity rufe ich sie auf. Prinzipiell werden mir (zumindest für meinen Teil) auch keine Fehler mehr angezeigt und es compiliert auch. Versuche ich das Ganze zu starten klappt das leider nicht und Android Studio gibt mir folgende Meldungen im Log aus:

at com.example.oepnv_tracking.MainActivity.<init>(MainActivity.kt:16)
at com.example.oepnv_tracking.GPSPosition.<init>(GPSPosition.kt:26)

Leider nicht wirklich weitere Informationen, deshalb weiß ich nicht, was genau sein Problem ist. Hat einer von euch eine Idee? :)
 
Zuletzt bearbeitet:
Du versuchst in Zeile 26 manuell eine Activity zu instanziieren. Das funktioniert so nicht. Activities funktionieren im Android Framework nicht wie "normale" Klassen und müssen immer von Android OS erstellt werden damit diese einen gültigen Context haben.

Stattdessen kannst du der Klasse GPSPosition ja die Activity als Parameter im Constructor rein geben.

PS: Wenn du irgendwann mal professioneller Software entwicklen willst, solltest du dich mit dem Konzept von "Dependency Injection" vertraut machen.
 
Zuletzt bearbeitet:
G00fY schrieb:
PS: Wenn du irgendwann mal professioneller Software entwicklen willst, solltest du dich mit dem Konzept von "Dependency Injection" vertraut machen.
Danke für den Tipp! Bin im Großen und Ganzen recht neu und arbeite aktuell zum ersten Mal mit Kotlin/Android Studio. Werden da ziemlich ins kalte Wasser geschmissen ^^'

G00fY schrieb:
Stattdessen kannst du der Klasse GPSPosition ja die Activity als Parameter im Constructor rein geben.
Habe ich mal versucht abzuändern. Er hat aber immer noch Probleme mit Zeile 16 / 27 und gibt leider nach wie vor keine (zumindest für mich) nachvollziehbaren Probleme an. Hast du da einen Vorschlag, was los ist?
 
In der Regel reicht es die Fehlermeldung bzw. den Stacktrace in die Google Suche einzugeben um zu sehen was man falsch gemacht hat.

Du darfst frühestens im onCreate auf die Activity zugreifen, da wie bereits erklärt, diese vom OS erstellt und sozusagen vorbereitet wird. Dein GPSPosition kannst du demnach auch erst frühestens im onCreate instanziieren und nutzen. Ähnlich wie deine TextViews, die intern ebenfalls den Context benötigen.
 
Zuletzt bearbeitet:
Ich hoffe das hilft?
 

Anhänge

  • Stacktrace.txt
    10,2 KB · Aufrufe: 64
Hab meine vorherige Antwort ergänzt. Dort habe ich den Grund erläutert.
 
Klar, das ergibt total Sinn ^^'

Dann sollte es am Ende so einfach sein wie "val gpshandler = GPSPosition(this)" in die onCreate Funktion zu packen, wenn ich das richtig verstehe. Danke dir!
 

Ähnliche Themen

Zurück
Oben