tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
13
ZUGRIFFE
909
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    realpk realpk ist offline Mitglied Silber
    Registriert seit
    Feb 2005
    Beiträge
    63
    Hallo,
    ich spiele ein bisschen gerade mit Java Android entwicklung herum. Wobei der Schwerpunkt meiner Frage reines Java ist.
    Leider ist mir aufgefallen, dass ich bei dem Thema einpaar Lücken habe und komme da irgendwie nicht weiter.

    Damit meine Anwendung nicht hängt, möchte ich die Daten über einen weiteren Thread besorgen. Leider darf dieser Thread nicht auf das UI zugreifen. Nun muss ich irgendwie wieder auf den richtigen Thread. Welche guten Möglichkeiten habe ich da in Java?

    Ich wollte es mit einem Event probieren. Scheinbar funktionieren Events in Java aber so, dass ich meine Listener als List speichere und dann einfach nur die Methoden der Listener aufrufe um das Event auszulösen. D. h. bei dem Thread Problem würde es mir nicht weiterhelfen, da die Events auch im gleichen Thread behandelt werden. Oder sehe ich das falsch?

    Vielen Dank und Grüße

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    
    public class activityClass extends Activity implements EventListener {
        
        TextView tv;
        String abc = "";
     
        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            abc = "";
            ImageButton ib = (ImageButton)findViewById(R.id.imageButton1);
            tv = ((TextView)(findViewById(R.id.textView1)));
           
            ib.setOnClickListener(new View.OnClickListener(){
                public void onClick(View v) {
                    new Thread(new Runnable() {
                        public void run() {
                                try 
                                {
                                    // BufferedReader füllt an dieser Stelle den String abc 
                                } 
                                // catch Blöcke
                        }
                    }).start();
                }
     
            });
            
        }
    ...
     

  2. #2
    SE Tutorials.de Gastzugang
    ich möchte hier mal nachfragen weil ich eines nicht verstehe
    warum darf dein thread nicht auf die UI zugreifen ?
    ich mein ... erstellen tust du die UI doch auch in einem eigenen thread *wenn du von main aus alles durchgehst ist das auch ein thread .. sog. Main-Thread* ...
    und wenn du jetzt das eventhandling in einen extra thread umleitest dann musst du diesem nur eine instanz der UI übergeben um darauf zugreifen zu können ...
    oder ist das durch irgendwelche umstände die ich nicht kennte unterbunden / nicht gestattet ?

    ansonsten können wir dir gerne helfen dein eventhandling in einen eigenen thread auszulagern *damit die UI halt nicht freezed*
     

  3. #3
    realpk realpk ist offline Mitglied Silber
    Registriert seit
    Feb 2005
    Beiträge
    63
    Hi, das Mainthread hat das UI erzeugt und der Workerthread soll nun etwas daran ändern. Die Referenz auf das Steuerelement habe ich. Aber wenn ich dies nun manipulieren will, bekomme ich eine Exception, dass ich im "falschen" Thread bin.

    Wie wäre dein Vorschlag bzw. Umsetzung mit Eventhandling damit das UI nicht einfriert?
     

  4. #4
    SE Tutorials.de Gastzugang
    ähäm ... erstens : poste doch bitte mal die exception ... weil mir ist auch nichts in nur irgendeiner weise bekannt das soetwas ausdrücken soll ...

    zweitens : meine variante des event-handling > auslagerung in externen thread

    du registrierst an einer component irgendeinen listener ...
    in der implementierung des listeners erzeugst du eine instanz einer klasse die runnable implementiet *oder halt von thread erbt* ... übergibst ihr das event und alle nötigen refferrenzen ... und schreibst dann am ende noch start() dran ...

    zur erläuterung *beispiel ActionListener*
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    public class Demo implements ActionListener
    {
        public static void main(String[] args) { new Demo(); }
        public Demo()
        {
            JFrame jf=new JFrame();
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jf.setSize(800, 600);
            jf.setLocation(200, 100);
            jf.setLayout(new FlowLayout());
            JButton jb=new JButton("BUTTON");
            jb.addActionListener(this);
            jb.setActionCommand("jb");
            jf.add(jb);
            jf.setVisible(true);
        }
        public void actionPerformed(ActionEvent e)
        {
            (new Thread()
            {
                public void run()
                {
                    //TO-DO
                }
            }).start();
        }
    }

    *ob man jetzt noch auf das ActionEvent zugreifen kann weis ich nich ... propiers mal aus*
     

  5. #5
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Hallo,

    @SPiKEe
    es ist zwar nett, dass du versuchst den Usern zu helfen, aber ich würde dich bitten dabei auch auf deine Groß- und Kleinschreibung zu achten.

    Gruß

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  6. #6
    Avatar von smileyml
    smileyml smileyml ist offline Tankwart
    tutorials.de Moderator
    Registriert seit
    Feb 2004
    Beiträge
    2.904
    Blog-Einträge
    14
    Und auch hier nochmal eine mündliche Verwarnung spIkeE.
    Halte dich an die Netiquette oder du kommst auf die Strafbank!
     

  7. #7
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Da ist wohl was schief gelaufen. Hab es korrigiert.

    Gruß

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  8. #8
    realpk realpk ist offline Mitglied Silber
    Registriert seit
    Feb 2005
    Beiträge
    63
    Hi, danke für dein Beispiel.
    Leider erkenne ich darin aber keinen Unterschied bzgl. Threads zu, meiner Lösung. Ob ich nun eine Methode nach der Fertigstellung aufrufe oder dies durch ein Event trigger. Ich bleibe doch immer im gleichen Thread!? Oder arbeitet jeder Thread das Event ab?

    Die Exception lautet übrigens: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

    Das Problem mit dem Zugriff auf Steuerelementen, aus einem anderen Thread, besteht doch eigentlich meistens.

    VG
     

  9. #9
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Schau mal hier, das sollte dir eigentlich helfen.
    http://developer.android.com/resourc...i-updates.html

    Hab nur kurz drüber geschaut, sieht aber nach einer Lösung über Events aus.
    Welche guten Möglichkeiten habe ich da in Java?
    Das hat aber nicht direkt was mit Java, sondern mehr mit dem Android-Framework zu tun.

    Gruß

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  10. #10
    SE Tutorials.de Gastzugang
    gut ... das nun eine exception von einem framework fliegt das ich nicht kenne erklärt natürlich das ich keine kenntnis dieser exception habe ...

    es scheint wie Sascha schon sagt etwas mit dem android-framework oder -plattform zu tun zu haben ...
    ich persönlich muss mich leider jeglichem hilfeversuch enthalten da ich keine kenntnis über das verwendeten framework habe ...
    dachte halt anfänglich das es ein gewöhnliches problem mit einer gefreezedten UI wäre ... lag da aber falsch
     

  11. #11
    realpk realpk ist offline Mitglied Silber
    Registriert seit
    Feb 2005
    Beiträge
    63
    Zitat Zitat von Sascha Schirra Beitrag anzeigen
    Das hat aber nicht direkt was mit Java, sondern mehr mit dem Android-Framework zu tun.
    Naja, ich habe zwei Threads. Thread A erzeugt Thread B. Meine Frage ist, wie komme ich von Thread B wieder auf Thread A.

    In C# kenne ich das Vorgehen über InvokeRequired und wenn benötigt dann ein Invoke.

    Eine Lösung über einen Timer ist dafür nicht die richtige Wahl. Verschleudern von Ressourcen und Performance, nur weil man nicht erkennt, was der richtige Weg für diesen Fall ist.

    Zitat Zitat von SPiKEe Beitrag anzeigen
    gut ... das nun eine exception von einem framework fliegt das ich nicht kenne erklärt natürlich das ich keine kenntnis dieser exception habe ...

    es scheint wie Sascha schon sagt etwas mit dem android-framework oder -plattform zu tun zu haben ...
    ich persönlich muss mich leider jeglichem hilfeversuch enthalten da ich keine kenntnis über das verwendeten framework habe ...
    dachte halt anfänglich das es ein gewöhnliches problem mit einer gefreezedten UI wäre ... lag da aber falsch
    Ich habe mal geschaut, wie es allgemein bei Java läuft und etwas interessantes gefunden (http://stackoverflow.com/questions/2...s-in-java-j2me).
    Dort steht z. B. dass bei Swing nur auf die Komponenten über den "event dispatch thread" schreibend zugegriffen werden darf.

    Allgemein würde ich es auch sehr unsauber finden, wenn jeder Thread irgendwie auf der UI rumhantiert.
     

  12. #12
    SE Tutorials.de Gastzugang
    dein post bezieht sich hier aber wie im link schon steht auf die J2ME ... ich kenne mich aber nur in der J2SE aus *ja .. ich schaffe es nicht mal J2EE mit tomcat zum laufen zu bekommen *
    wenn du jetzt also durch J2ME und Android vorgeschrieben bekommst das nur der EDT auf UI-componenten schreiben zugreifen darf ... dann sollte auch irgendwo in der doc dazu stehen wie man dann diesen EDT manipuliert damit er das macht was man will ...
    man könnte sicher irgendwas über die SystemEventQueue und invokeLater(Runnable) basteln ... aber ob das in J2ME auch so geht weis ich wie gesagt nicht ...
    ich wollte mich zwar mal mit J2ME beschäftigen .. aber mir war der konzeptionelle aufbau schon kompliziert genug davon gleich wieder die finger zu lassen
     

  13. #13
    genodeftest genodeftest ist offline Mitglied Brillant
    Registriert seit
    Jun 2009
    Beiträge
    870
    Dalvik (Android's Interpreter für Java-ähnlichen Bytecode) hängt nicht direkt mit J2ME zusammen, sondern ist ein Fork von Apache Harmony (eine J2SE Runtime). Wie das graphische Framework von Android aufgebaut ist, weiß ich leider nicht. Allerdings gilt für jede Anwendung (fast unabhängig von der Programmiersprache) die Regel, dass zeitaufwändige Arbeiten nicht in dem Thread ausgeführt werden sollen, der für die graphische Darstellung zuständig ist. Wichtig ist auch, dass man bedenkt, dass alle I/O-Operationen zeitaufwändig sein können (z.B. wenn Dateien von einer Netzwerkfestplatte geholt werden, wenn die Festplatte sich erst hochfahren muss, überlastet ist, ...).

    Naja, ich habe zwei Threads. Thread A erzeugt Thread B. Meine Frage ist, wie komme ich von Thread B wieder auf Thread A.
    Unter Swing/AWT würde man da ein AWTEvent nutzen, siehe https://secure.wikimedia.org/wikiped...atching_thread und http://download.oracle.com/javase/tu...ncy/index.html

    Mit diesem Stichwort findet man auch Artikel zu Android:
    http://developerlife.com/tutorials/?p=1263

    vielleicht hilft dir auch dieser "SwingWorker" weiter: http://linuxmedianetwork.blogspot.com/
     
    Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  14. #14
    realpk realpk ist offline Mitglied Silber
    Registriert seit
    Feb 2005
    Beiträge
    63
    Yeah habs mit AsyncTask hinbekommen. Danke für eure Tipps.
     

Ähnliche Themen

  1. Ein eigenes Betriebssystem fragen Thread
    Von cinema im Forum Sonstige Sprachen
    Antworten: 6
    Letzter Beitrag: 07.11.10, 11:10
  2. [eclipse] Eigenes Event feuern?
    Von Vatar im Forum Java
    Antworten: 5
    Letzter Beitrag: 27.05.07, 12:51
  3. Eigenes Event erstellen
    Von Divi im Forum .NET Windows Forms
    Antworten: 10
    Letzter Beitrag: 27.05.06, 20:08
  4. eigenes Event
    Von skoWWi im Forum Java
    Antworten: 3
    Letzter Beitrag: 16.06.05, 19:29
  5. Wie mache ich ein eigenes Event mit eigenem Listener?
    Von GoldKaetzchen im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 8
    Letzter Beitrag: 21.05.05, 15:00