Android Verständnis frage zu Threads//AsyncTasks

Bitstubbi

Mitglied
Hiho...

Ich steh vor einem kleinen Problem und hoffe mal ihr könnt mir ein wenig weiter helfen.

Ich möchte einen kleinen Messanger realisieren. Das ist normalerweise auch grade kein Problem, ich habe es immer so gemacht, das auf Clientseite ein Thread läuft, dessen run() Methode jede Sekunde einen inputstream list. Also quasi so:

Java:
//Java-Pseudocode:
while(running){
          msg = (Message) input.readObject(); 
          try{
          //Thread.slepp(1000)....
          }
}

Der Server funktioniert analog. Dieser stellt bei meinem aktuellen Projekt auch kein Problem dar, da er nicht auf einem mobilen Gerät läuft.
Mein Problem: Ich darf den Hauptthread nicht nutzen für das Netzwerk gerechne. AsyncTasks, sind hier für in meinen Augen auch ungeeignet, da ich hier entweder auch eine while(true)-Schleife laufenlassen müssten, und diese nach dem Empfangen einer Nachricht beenden müsste, um dann das ganze Spiel wieder von Vorne anfange zulassen. Das kanns ja nicht sein oder?

Ich bin für jede Anregung, Idee oder Codeschnippsel dankbar ;)

MfG BitStubbi
 

Bitstubbi

Mitglied
Das Observer Pattern kenne ich, jedoch muss ich die Clients ja benachrichtigen, sprich die Clients müssen wieder warten, bis der Server ein notify an die Clients schickt.
Der Server kann ja nicht einfach über Sockets eine Methode im Client auslösen.
 

anti-held

Bekanntes Mitglied
Warum lässt du den Thread immer 1 sec warten?
Die Methode readObject() blockiert doch eh den Thread solange, bis ein Objekt gelesen werden kann.
 

dzim

Top Contributor
Du willst eigentlich einen Service, oder - der sollte zwar auch auf einem anderen Thread laufen, aber grundsätzlich kommen hier gerade ein paar Konzepte durcheinander, glaube ich.

AsyncTask wird i.d.R. für relativ kurzfristige Arbeiten gebraucht - zum Beispiel, um asynchron einen Fortschrit anzuzeigen (#publishProgress() und andere Methoden deuten es ja schon an). Auch um Fortschritts Dialoge zu zeigen, oder wenn etwas bei einem Hintergrundprozess schief geht (ein Toast).

Ein Service ist für länger laufende Operationen gedacht, also z.B. Datensynchronisation, bla bla bla...

Mit deinem Plan, einen Messanger zu implementieren glaube ich du willst über's Netz kommunizieren, oder?
Mich verwirrt es nämlich, weil es schon einen Messanger in Android gibt, dessen Fokus etwas anders ist: zwischen Threads Nachrichten austauschen. Ich verwende es z.B. um von einen Service Nachrichten an die UI zu senden (konkret: Fortschritt einer SpeedTest-Messung).

Wie schon gesagt wurde, blockiert ja die Operation oben - vielleicht wäre es sinnvoll die Verarbeitung dann wieder in andere Threads auszulagern...

Wie auch immer, ich glaube, du möchtest einen Service und da lege ich dir - wie so oft in anderen Fällen auch schon - die Tutorials von Lars Vogel nahe: Android Development
Es ist kein ganz triviales Thema und ich gebe zu, dass ich es Anfangs nur kopiert habe und erst später das Verständnis einsetzte, aber ich glaube, dass es dir weiterhelfen könnte.
 

Bitstubbi

Mitglied
Ich hab mich mit Services beschäftigt, diese kan nich aber nicht 24/7 im Hintergrund laufen lassen :-/ somit ist das nicht das gesuchte :p

Noch wer ne Idee?
 

dzim

Top Contributor
Hm... Ich bin mir nicht sicher, dass du überhaupt etwas 24/7 im Hintergrund laufen lassen solltest, aber:
Doch - du kannst das mit Services sehr wohl erreichen!
Tatsächlich kann mein Service genau dass (wenn man die SpeedTests so einstellt). In dem Fall wird alle X-Minuten für eine astronomisch lange Zeit eine SpeedTest-Messung ausgeführt... Keine wirkliche Hexerei.

Du musst dann von Service selbst erben und recht viel "Kram" machen (konkret kümmere ich mich mittels des Messengers darum, alle an den Service gebundene UIs zu updaten - wenn die Haupt-UI offen ist).
Der Fairnis halber sollte man sagen, dass ein schließen der App (wegschieben im Tasker) dieses Service abwürgt.
Bedenke nur einfach, dass dies recht viel Strom kostet, wenn der Thread nicht gerade blockiert, sondern läuft und läuft und läuft...
In der Doku wird halt vor solchen Scenarios gewarnt und du musst dir sicher sein, dass du das wirklich willst.

Wenn ich mal Lust und Laune hab, bastel ich mal ein Beispiel, dass dir zeigt, was ich meine... Wichtig ist einfach, dass die eigentliche Arbeit nicht im Service, sondern in einem Thread stattfindet.
 

Bitstubbi

Mitglied
Einen Service kann ich (auch) dank eurer Links implementieren.
Jedoch versteh ich nicht so ganz, wie mich das weiter bringt...
Okay im Hintergrund läuft jetzt was das ist richtig :p jedoch hab ich doch nur onStart und onDestroy-Methoden.
Wie hilft das mir jetzt eine Nachricht zu empfangen?

Sorry aber das hier ist für mich noch recht undurchsichtig.
 

dzim

Top Contributor
Hab ich doch gesagt, dass es nicht ganz trivial ist...

jetzt hängt es davon ab, wie du dir generell die Kommunikation vorgestellt hast. Gibt es einen Server von dem du periodisch Daten holst? Oder meldest du dich bei einem Server an und der sendet dir Daten zu...
Wenn du das geklärt hast, musst du einen Android-Messenger verwenden. Im Wesentlichen ist es ein EventHandler, der dir an registrierte Listener (über die Grenzen von Threads hinweg) die empfangene Nachricht weiterleitet.
Pseudo-Code in etwa so:
Code:
private static final int MSG_MESSAGE_RECEIVED = 1;

private Messenger mMessanger; // init somewhere else
private List<Listener> mClients; // the same - and the interface is wrong - google it

private void listenForMessagesFromTheInternet() {
  String message = "";
  while ((message = inStream.read())!="stopCondition") { // blocking
    for (Listener l : mClients) {
      Message m = new Message(MSG_MESSAGE_RECEIVED, l);
      mMessenger.send(m);
    }
  }
}

dein "Listener" ist z.B. auf Sseite der Activity implementiert und schaut, ob es die Nachrticht MSG_MESSAGE_RECEIVED war, liest den String aus und macht damit irgendetwas.
Dieses Beispiel (als Remote Messenger Service Example) findest du auch hier: Service | Android Developers

Alternativ verwendest du einen Broadcast (Service-Seite) und registrierst einen BroadcastReceiver (UI-Seite).
Das wird hier beschrieben: Android Service Tutorial

So. Habe fertig...

Wenn du es mit all den Ideen (und Links), die ich dir jetzt bereits unterbreitet habe, nicht hinbekommst, würde ich vorschlagen, dass du noch mal ein paar Schritte in der Android-Entwicklung zurückgehst. Lieber erst mal Grundlagen beherrschen, bevor man sich ohne jede Peilung (sorry!) ins Getümmel schmeisst.

Mehr Tipps kann ich da auch nicht mehr geben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Android SurfaceView Verständnis Android & Cross-Platform Mobile Apps 2
M Frage zu OnClickListener. Verständnisproblem Android & Cross-Platform Mobile Apps 5
xXSkyWalkerXx1 Android Bluetooth LE - Frage zur Funktionalität Android & Cross-Platform Mobile Apps 26
M Frage zu setContentDescription Android & Cross-Platform Mobile Apps 2
G Google Play Store Design Frage Android & Cross-Platform Mobile Apps 2
Augenblau Android Frage zu den unterschiedlichen Menüarten Android & Cross-Platform Mobile Apps 0
S AsyncTask und doInBackground Frage Android & Cross-Platform Mobile Apps 2
L Android Generelle Frage zur Spieleprogrammierung unter Android Android & Cross-Platform Mobile Apps 2
H Frage bei erstellen eines Projectes Android & Cross-Platform Mobile Apps 3
G Wissen frage - wo am besten Speichern. Android & Cross-Platform Mobile Apps 1
J Android ganz kurze frage Android & Cross-Platform Mobile Apps 2
K Android Frage zu Themes/Styles Android & Cross-Platform Mobile Apps 5
kaoZ Android Allgemeine Frage zum Händeln mehrerer EditTextfelder Android & Cross-Platform Mobile Apps 25
R Frage zu Widgets Android & Cross-Platform Mobile Apps 2
B Kurze Frage zu Play Store? Android & Cross-Platform Mobile Apps 2
U Android Kleine ImageButton Frage Android & Cross-Platform Mobile Apps 2
U Android Frage zu eigenen Adaptern Android & Cross-Platform Mobile Apps 2
U Android ListView Frage Android & Cross-Platform Mobile Apps 6
M Frage zu Java Programm für Windows Mobile 6.5 Android & Cross-Platform Mobile Apps 2
P Allgemeine frage bzg. Android Android & Cross-Platform Mobile Apps 10
H FileConnection: Frage nach Dateisystem-Zugriff unterdrücken Android & Cross-Platform Mobile Apps 5

Ähnliche Java Themen

Neue Themen


Oben