Suche Rat bezüglich Netzwerkverbindungen

  • 4 Antworten
  • Letztes Antwortdatum
Y

Yothri

Neues Mitglied
4
Hallo,

ich bin derzeitig dabei eine App zu programmieren bei der es rein um die Kommunikation mit einem TCP Server geht welcher auf dem PC läuft.

Heißt der Android Teil ist "nur" der Client in meinem Fall.

Nun gibt es im Internet ne Menge Beispiele, jedoch kann ich mich mit diesen irgendwie nicht so sehr anfreunden.
Die meisten Beispiele sind mit dem AsyncTask gemacht was ich allerdings vermeiden möchte da ich auch gelesen habe das der AsyncTask eher für Aufgaben genutzt werden soll die nicht so lange dauern (2-3 Sekunden). Ob das nun stimmt oder nicht ist mir zwar nicht egal, aber ich bin mir nicht sicher ob der dafür geeignet ist.

Ich programmieren einen WebRadio Client für den PC welcher von Android aus gesteuert werden kann. Dafür soll eine TCP Verbindung zwischen den Geräten aufgebaut werden. Diese soll aber nicht nur für 2-3 Sekunden bestehen sondern solange, wie die App gestartet ist. Dachte vielleicht dafür ist ein Android-Service vielleicht das richtige?

Jedenfalls hab ich bereits eine funktionierende Implementation hinbekommen allerdings habe ich Probleme mit dem disconnecten des Clients und des richtigen reagierens der UI usw.

Was ratet ihr mir bei meinem Vorhaben? AsyncTask oder doch was anderes?

Bis jetzt mach ich es auch so, dass ich den AsyncTask in eine Klasse verlagert habe, welche einen Singleton hat.
Somit kann ich von jeder Activity darauf zugreifen. Ist das in Ordnung oder gibts da andere Lösungen. Denn der Zugriff von mehreren Activities muss möglich sein.

Danke im Voraus
 
Threads, Asynctask, Services. Im Grunde sind das alles einfach Lösungsvorschläge die dir helfen deinen Code vom UI Thread zu kriegen.
Ein einfacher Thread genügt für deine Bedürfnisse vollkommen. Genauso ein gebundener Service. Und Asynctask eben auch.

Es läuft alles auf dasselbe hinaus. Jedoch unterscheiden sie sich in den Implementierungen. Für einen einfachen Thread wirst du am meißten Code schrieben müssen um mit dem UI Thread kommunizieren zu können. Ein Service erfordert auch eine gewisse Menge an Code und ist quasi wie eine Activity nur ohne Interface.
Ein Asynctask ist ein sehr klug implementierter Thread der dir viele Methode zur Verfügung stellt um zum Beispiel mit dem UI Thread zu kommunizieren und sollte allen deinen Ansprüchen genügen.

Mein Rat: nimm Asynctask bzw. bleib dabei.Das wird auch von Google so empfohlen.

Wenn du Probleme bei der Implementierung deiner Logik hast kannst du jederzeit hier im Forum einen Thread eröffnen und dir wird sicher ganz schnell geholfen werden.
 
Hallo @Jaiel

ich danke dir vielmals für deine schnelle und umfangreiche Antwort. Genau sowas habe ich jetzt gebraucht.

Habe zwar in der Zwischenzeit angefangen bissle rum zu probieren und mal eine Implementierung mit der Thread bzw. Runnable Klasse gemacht.
Ich probiere das jetzt auch mal aus, werde aber wahrscheinlich beim AsyncTask bleiben.

Vielen vielen Dank.

Mit freundlichen Grüßen
Yothri
 
Hey ich wollte ncohmal wwas ergänzen:
Für deine Bedürnisse eine Verbindung aufrecht zu erhalten würde ich jedoch mehr zu einem Service tendieren als zu einem Asynctask. Oder einer Asynctask+Thread lösung. Da du wie schon richtig gesagt hast ein Asynctask dafür nicht ausgelegt ist. Es gibt auch noch Futuretask, Executor und ThreadPoolExecutor. Für weitere Referenzen siehe in den Google Docs :

AsyncTask | Android Developers

Services | Android Developers

Processes and Threads | Android Developers

Viel Erfolg
 
Also was dann eventuell noch erwähnenswert ist:

  • Ich möchte von/in mehreren Activities Nachrichten senden sowie empfangen können.
    • Dazu dachte ich könnte ein Interface helfen welches bei onCreate der jeweiligen Activity mit dem Singleton immer sich selbst instanziert.
  • Die Start Activity ist meine ConnectActivity in der es möglich ist eine IP Adresse sowie einen Port anzugeben.
    • Optional hab ich schon ein Button eingebaut der per QR Code das ganze einscannt und in die Textfelder schreibt. (Funktioniert schon).
  • Dann soll noch in der ConnectActivity eine Verbindung aufgebaut werden und entsprechend reagieren.
    • Verbindung erfolgreich -> Starte ControlActivity (wo man dann die Lautstärke und alles andere regeln kann)
    • Verbindung fehlgeschlagen -> Einen Toast erstellen der den User informiert, dass die Verbindung fehlgeschlagen ist.

Am einfachsten wäre das alles halt wirklich mit einem Singleton. So hatte ich das ganze auch schon gemacht.
Allerdings hat's eben beim Error-Handling gehapert.
Als Beispiel nenne ich mal ein Problem:
Instanzieren der Socket Klasse ist ja kein Problem solange ich den Konstruktor instanziere welcher zunächst keine Parameter nimmt.
Sobald ich dann die connect-Methode aufrufen möchte kann das Error Handling ja beginnen.
Heißt mit Try-Catch werden die Exceptions abgefangen.
Soweit so gut, aber ich weiß nicht wie ich die Exceptions in Nachrichten verfassen kann sodass diese auch wieder per Toast ausgegeben werden können. Ich möchte wirklich die Möglichkeit haben, jeden noch so kleinsten Fehler bis an den UI Thread zu schicken sodass, auch wenns unnötig ist, es mir möglich ist zu jeder Exception 'ne Nachricht zu verfassen sodass der Benutzer informiert ist.

Hab's zuerst auch wieder so gemacht, dass ich in das Interface ne zusätzliche Methode erstellt habe die sich OnNetworkClientException(String errorMessage) und diese dann in den gecatchten Exceptions aufrufe. Aber mir kommt das unsauber vor und ich würde auch gerne mal wissen wie Profis das lösen.

Das sind so Sache die ich, obwohl ich schon ziemlich viel Programmiererfahrung, wenn auch nur in C-Sharp, immer noch nicht richtig verstehen/weiß was jetzt langsam mal Zeit wird.

Also ich hoffe ich habe jetzt niemanden abgeschreckt mit allem was ich hier verlange aber ich will halt lernen.

Ich danke euch im Voraus.
 

Ähnliche Themen

M
Antworten
21
Aufrufe
1.358
swa00
swa00
migi01
Antworten
26
Aufrufe
1.985
migi01
migi01
Zurück
Oben Unten