Problem mit Threads und Handler

  • Hi Leute,
    ich kämpfe schon ne geraume Zeit mit Threads und Handlern und hab schon viele Seiten durchgelesen aber ich verstehs nicht. Also
    ich hab 'ne Instanz einer Threadklasse mit Looper, und die übermittelt Daten (strings) zu meinem UI-Thread und mittles Toasts werden die auch angzeigt. das klappt! Dafür habe ich von meinem UI-Thread einen Handler beim Erzeugen des Threads-Objekt mitgegeben.
    Jetzt möchte Daten von meinem Ui-Tread zum anderen Thread schicken. Dort habe ich einen Handler angelegt der die messages verarbeiten soll.
    Wie bekomme ich diesen Handler vom Thread. Ich habe ne Methode die den Handler mit return zurück liefern, soll aber der ist immer null.
    Wie holt man sich einen Handler aus einem Thread? ?(

  • Also als erstes solltest du Androids eigenen Asynctask nutzen, da kannst du in der preexecute methode die daten vom mainthread in den eigenen thread geben und in postexecute kannst du daten vom eigenen thread in den mainthread übergeben.


    Wenn das Senden von Informationen zum Thread bzw vom Thread asynchron verlaufen soll, hast du schon den richtigen weg gewählt: Den Handler. Ich würde dir aber empfehlen einen langlebigeren Thread in einen Service auszulagen.


    Nun zu deiner eigentlichen Frage.
    Du kannst doch beim instanziieren deines Threads einen Handler an den Thread übergeben der dann im Thread genutzt werden kann um Nachrichten an den MainThread zu senden. Das sieht ungefähr so hier aus:

    Java
    Handler mainThreadHandler = new Handler();
    CustomThread myThread = new CustomThread(mainThreadHandler);



    Sobald dein Thread instanziiert ist kannst du in diesem Thread einen weiteren Handler instanziieren den du über eine get Methode einfach abfragen kannst (Das setzt voraus das du für deinen eigenen Thread eine Klasse hast die von Thread erbt). Da kannst du vom MainThread aus dann einfach sowas hier aufrufen.


    Java
    Handler customThreadHandler = myThread.getHandler();
  • @ChampS Vielen Dank für deine Antwort! Teilweise hatte ich es so wie du sagtes, und hatte aber auch noch neue Erkennisse durch deine Tipps. Es geht aber leider immer noch nicht richtig. Also ich hole ein wenig aus. Ich versuche eine SPS Logo! per android anzusteueren(rein private Sache). Das funktionierte in der Androidversion 2.3. Jetzt im Emulator mit Android4.0 bekomme Netzwerkfehler. Mann darf ab Android 3.irgenwass wohl keine zeitintensiven Sachen wie TCP etc. im UiThread machen. Deswegen lagere ich die Tcp-Funktionen in einen Thread aus, der läuft auch d.h. ich kann kann daten aus der sps auslesen und im UIThread anzeigen lassen. Mithilfe eines Handlers den ich im UIThread erstelle und beim Erzeugen des TCP-Threads mitgebe bekomme ich die Daten alle paar ms in den UI-Tread. Der Punkt der nicht geht ist das Senden von Befehlen vom Ui-Thread in den TCP-Thread.


    vom UiThread rufe ich per button klick diese Zeile auf:
    MyThread2.tHandler.sendEmptyMessage(3); // MyThread2 ist mein TCP-Thread


    Ich sehe im Locat das der Button 6 mal geklickt wird, aber es passiert erstmal nichts. Erst wenn das Programm den verbindung schliesst und ich es dann verlasse dann erscheinen die 6 Messages mal. Ich habe auch tHandler = new Handler(Looper.getMainLooper()) aus probiert, dann kommen die Reaktion auf den Buttenklick sofort, aber dann gibts die Netzwerk-Fehlermeldung (nodave-Funktionen). Also hängt das doch mit dem Looper zusammen, weil ich ja dann die Netzwerkfunktionen mithilfe des Mainloopers ja wieder im UIThread machen will, oder? Aber wie kriege ich den richtigen Looper meines TCP-Threads. Ich bin wirklich ein wenig am verzweifeln.

  • Jaja das weiß ich. Den Handler, den ich beim Erstellen des TCP-Thread()(MyThread2) mitgeben funktioniert ja auch. Die Daten werden korrekt vom TCP-Thread zum MainThread(UI-Thread) übertragen.
    Nur der Handler den ich im TCP-Thread erstellen, der Daten vom Main-Thread zum TCP Thread übertragen soll will nicht richtig. Ist für mich schwierig zuklären. Wenn der Handler im TCP-Thread außerhalb des run() funktion erzeugt wird, empfängt er die message aber es gibt dann ne Fehlermeldung das versucht wird eine Netzwerkfunktion innerhalb der UITHread zu benutzten., also scheint der HAndler im TCPTHread nicht wirklich im TCPTHread zu existieren. Naja und das verstehe ich nicht. Irgendwie hängt das wohl mit den Loopern zusammen? bin ratlos

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!