Internetverbindung in Service für TCP Polling überwachen

  • Antworten:7
LitteM
  • Forum-Beiträge: 141

24.12.2014, 15:18:51 via Website

Hallo zusammen,

Ich habe in meiner App einen Service. Dieser Service startet mir einen Thread der in bestimmten Zeitabständen Daten von einem Server per TCP anfordert. Nun würde ich gerne eine Art Exception handling für internet connection lost & reconnected einbauen.

  1. Das polling sollte schon in einem separaten Thread stattfinden, oder?

  2. Gibt es da ne Art best practice wie man connection lost handelt? Einfach einen Broadcast in die Exception reinschreiben welche der Service abfängt um zu wissen das was schief geloffen ist und dementsprechend den Thread nach Internet-Status-Abfrage neu startet?

Falls das dann gereget ist habe ich noch ein zwei Verständnis-Fragen zum generellen Thema service. Die schreib ich dann einfach auch in den Thread hier rein sobald die zwei Punkte von oben geklärt sind :)

Danke & schöne Weihnachtsfeiertage!

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

24.12.2014, 15:58:30 via App

Hallo,

  1. Pollen ist nicht optimal, dafür gibt es Google GCM also einen Push Service etc.
    Aber das gehört nur am Rande zum Thema.

  2. Ja wenn du pollst immer in Seperaten thread.

  3. Wenn du wissen willst ob die Internet Verbindung weg ist, würde ein Broadcast Reciver auf connect und disconnect reichen. Falls nicht dann kannst du in regelmäßigen Abständen die Internet Verbindung prüfen.

Wenn die verbindung weg ist kommt deine Exception diese musst du abfangen und behandeln je nach Typ. Also Timeout etc. Daduch bekommst du schon raus was der Fehler ist. Ich würde aber trotzdem nich per Reciver prüfen damit wenn die verbindung wieder da ist dein polling wieder starten kann.

Frohe Weihnachten

LG Pascal

— geändert am 24.12.2014, 16:00:40

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
LitteM
  • Forum-Beiträge: 141

24.12.2014, 16:41:15 via Website

Wir wollten etwas unabhängig von allem etwas entwickeln, daher haben wir Verschlüsselung & Protokoll selbst entworfen. GCM kenne ich jetzt nur vom Namen her, daher weiß ich nicht was das genaut tut. Könnten theoretisch auch auf "push, dann pull" -Verfahren umstellen. Bisherige "Tests" meiner Seite haben wenig Akku-Verbrauch bei einem Tag unter Pull-Nutzung gezeigt.

Zu 3: Wenn eine Exeption fliegt, dann wird ja der Thread der momentan pullt beendet. Ich müsste ihn demnach ja wieder neu starten (sofern eine Internet-Verbindung besteht). Hätte das jetzt spontan über einen Receiver im Service gemacht der mir bei disconnect ne notification raus gibt und bei (re-)connect einfach den thread neu startet. Aber wenn andere Ursachen den Thread eine Exception werfen lassen muss ich das ja auch irgendwie mitbekommen. Wäre da nicht ein Broadcast das einfachste?

— geändert am 24.12.2014, 16:44:27

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

24.12.2014, 16:48:56 via App

Du könntest ja auch die Exception im Thread behandeln so wird dieser nucht beendet. Wenn dann keine Verbindung ist, Thread beenden.
Broadcast Reciver ->new Connect also man hat eine Verbindung -> Pollthread starten.

Natürlich kannst du auch "dreist" sein und sagen die Exceptions interessieren mich nur teilweise. Dann die abfangen die dich interessieren und die anderen ignorieren. So pollt deine Thread auch wenn keine Verbindung da ist aber das stört ja nicht, denn er macht normal weiter wenn wieder eine Verbindung besteht.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
LitteM
  • Forum-Beiträge: 141

24.12.2014, 17:00:09 via Website

Ja so in etwa hatte ich mir es gedacht. Aber Exceptions ignorieren und trotzdem weiter-pollen ohne Internetverbindung fände ich weniger optimal für den Akku. Momentan habe ich ein poll-invervall von 10s eingestellt. Was meiner Meinung nach schon fast ausreicht, da man für das Verfassen einer Nachricht oft länger als 5 Sekunden braucht. Hatte mir überlegt, dieses Intervall dem Nutzer zugänglich zu machen damit man das selbst festlegen kann.
Beispielsweise: Nur wenn die App an/minimiert ist, generell alle 5/10/30/60/240 sekunden... etc.
Oder für verschiedene Szenarien unterschiedliche Zeiten: App minimiert/aus, Chat Fenster Aktiv etc.

Habe das bis jetzt schon implementiert, fehlt nur noch die "übermittlung" des wertes an den Service. Was hältst du denn von so einer Einstell-Möglichkeit?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

25.12.2014, 19:25:29 via App

Ich weiss nicht ich würde so eine Einstellmöglichkeit machen. Aber den User darüber Informieren für was die Einstellung ist.
Am besten du benutzt die SharedPreferences.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
LitteM
  • Forum-Beiträge: 141

25.12.2014, 22:27:00 via Website

Ja, darüber Informieren was das ist werde ich dann in jedem Fall :)
Bisher habe ich einen Singelton/Sqlite für die "runtime-settings" benutzt. Shared preferences werden dauerhaft in form einer Datei intern gespeichert, oder? Das heißt egal ob die App mal aus war, die gespeicherten values bleiben unverändert? Habe bisher noch nie mit SharedPreferences etwas gemacht.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

25.12.2014, 23:16:36 via App

Ja die SharedPreferences werden intern als XML Datei gespeicher. Da ist es egal ob die App aus ist.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten