Die Loop in einem Thread auf ein Event warten lassen - klappt nicht

  • Antworten:12
Daniel
  • Forum-Beiträge: 99

13.04.2014, 23:41:48 via Website

Moin, also mein Problem ist, ich möchte eine Loop auf ein Ergebnis(Event) warten lassen, aber irgendwie funktioniert das nicht ganz gut bzw. ich brauche eine elegantere Lösung. Vorerst ich verspreche euch, ich Google schon seit 6 tagen und komme zu keinem vernünftigen Ergebnis, stackoverflow zu dem Thema ausgelesen... Ich will eine Loop, der in einem Thread läuft, auf ein Button Press im Prinzip warten lassen, aber das will nicht so ganz , bzw. meine Schleife läuft laut LogCat einfach weiter wien Zombie und wartet auf nichts.

try {
                            handler.post(new Runnable(){
                                @Override
                                public void run() {
                                    vier.setPressed(true);  
                                }
                            });
                            Thread.sleep(1500);
                            handler.post(new Runnable(){
                                @Override
                                public void run() {
                                    vier.setPressed(false); 
                                }
                            });
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        Thread check = new Thread(new Runnable(){
                            public void run(){
                                handler.post(new Runnable(){

                                    @Override
                                    public void run() {
                                        dreieck.setOnClickListener(MainActivity.this);
                                        vier.setOnClickListener(MainActivity.this);
                                        sechs.setOnClickListener(MainActivity.this);
                                        kreis.setOnClickListener(MainActivity.this);    
                                        while(!Clicked){
                                            try {
                                                Thread.sleep(1000);
                                            } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                            }
                                            finish();

                                        }
                                    }

                                });
                            }

                        });
                        check.start();
                        try {
                            check.join();
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        break;

onClick ist mit Clicked = true ausgestattet. Im Prinzip sollte die ganze App, der ganze Vorgang nur auf diesen ButtonPress warten, der Clicked zu true macht. P.S. Clicked ist die Klassenvariable

— geändert am 14.04.2014, 17:18:59

Antworten
Daniel
  • Forum-Beiträge: 99

13.04.2014, 23:42:52 via Website

Ich hab schon was von ActionPerfomed gelesen und mich gefreut ne bessere Lösung zu finden als auf die Änderung einer Variable zu warten, aber da kam wieder OnClickListener.. naja, Bitte helft mir ich rätsel schon die ganzen Tage

Antworten
Daniel
  • Forum-Beiträge: 99

14.04.2014, 01:43:16 via Website

Und ja wenn Clicked=true ist, läuft der Thread vlt erst mit 1 sek Verzögerung weiter , ist mir bewusst ^^

Antworten
Daniel
  • Forum-Beiträge: 99

14.04.2014, 15:13:48 via Website

Wenn ihr nicht verstanden habt, was ich meine, könnt ihr nachfragen, mir ist es soweit klar, was ich aussagen wollte :grin:

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

14.04.2014, 15:47:44 via Website

Beschreibe mal was du überhaupt machen willst. btw:

dreieck.setOnClickListener(MainActivity.this);
dreieck.setOnClickListener(MainActivity.this);
dreieck.setOnClickListener(MainActivity.this);
dreieck.setOnClickListener(MainActivity.this); 

Auf Views etc. dafst du nur Aus dem Main Thread zugreifen. Du machst dies in einem Anderen

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

Antworten
Daniel
  • Forum-Beiträge: 99

14.04.2014, 17:17:23 via Website

Ich habe OnClickListener implementiert in die MainActivity, die ja von Activity erbt. heißt meine views sind über public void on Click geregelt für die ganze Klasse. ach jetzt ist mir aufgefallen, hab zu viel strg+z benutzt, jaja hab vier views die ich jeweils aktiviert habe mit setOnClickListener, also vier verschiedene^^ Der Sinn ist insgesamt, da werden 3 Symbole gezeigt und die muss man dann "nachclicken".

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

14.04.2014, 18:12:51 via Website

So das ist schön und tut aber was funktioniert jetzt nicht? Wird der Thread ausgeführt? (Debugmodus)

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

Antworten
Daniel
  • Forum-Beiträge: 99

14.04.2014, 18:33:06 via Website

Der wird ausgeführt , steht Running. Mir ist aufgefallen, dass die while(!Clicked) nicht im handler.post sein darf, weil ja sonst der Main-Thread gemeint ist oder?

̶h̶̶a̶̶b̶̶ ̶̶d̶̶a̶̶s̶̶ ̶̶j̶̶e̶̶t̶̶z̶̶t̶̶ ̶̶n̶̶a̶̶c̶̶h̶̶ ̶̶h̶̶a̶̶n̶̶d̶̶l̶̶e̶̶r̶̶.̶̶p̶̶o̶̶s̶̶t̶̶ ̶̶a̶̶l̶̶s̶̶o̶̶ ̶̶i̶̶n̶̶ ̶̶d̶̶i̶̶e̶̶ ̶̶v̶̶o̶̶i̶̶d̶̶ ̶̶r̶̶u̶̶n̶̶ ̶̶v̶̶o̶̶m̶̶ ̶̶t̶̶h̶̶r̶̶e̶̶a̶̶d̶̶ ̶̶c̶̶h̶̶e̶̶c̶̶k̶̶ ̶̶g̶̶e̶̶p̶̶a̶̶c̶̶k̶̶t̶̶ ̶̶u̶̶n̶̶d̶̶ ̶̶e̶̶s̶̶ ̶̶w̶̶a̶̶r̶̶t̶̶e̶̶t̶̶ ̶̶z̶̶w̶̶a̶̶r̶̶ ̶̶j̶̶e̶̶t̶̶z̶̶t̶̶ ̶̶a̶̶b̶̶e̶̶r̶̶ ̶̶d̶̶a̶̶s̶̶ ̶̶f̶̶i̶̶n̶̶i̶̶s̶̶h̶̶ ̶̶w̶̶i̶̶r̶̶d̶̶ ̶̶t̶̶r̶̶o̶̶t̶̶z̶̶d̶̶e̶̶m̶̶ ̶̶a̶̶u̶̶s̶̶g̶̶e̶̶f̶̶ü̶̶h̶̶r̶̶t̶̶ ̶̶o̶̶b̶̶w̶̶o̶̶h̶̶l̶̶,̶̶ ̶̶d̶̶e̶̶r̶̶ ̶̶d̶̶o̶̶c̶̶h̶̶ ̶̶s̶̶l̶̶e̶̶e̶̶p̶̶e̶̶n̶̶ ̶̶s̶̶o̶̶l̶̶l̶̶,̶̶ ̶̶w̶̶r̶̶m̶̶? OK, jetzt wartet auch das gesamte Programm, ok, aber komischerweise wenn meine app über dieses finish beendet wird, läuft die Schleife trotzdem noch durch, weil ich jeden Schleifendurchlauf per LogCat sehen kann wegen log.d. Warum?

try {
                        handler.post(new Runnable(){
                            @Override
                            public void run() {
                                vier.setPressed(true);  
                            }
                        });
                        Thread.sleep(1500);
                        handler.post(new Runnable(){
                            @Override
                            public void run() {
                                vier.setPressed(false); 
                            }
                        });
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    Thread check = new Thread(new Runnable(){
                        public void run(){
                            handler.post(new Runnable(){

                                @Override
                                public void run() {
                                    dreieck.setOnClickListener(MainActivity.this);
                                    vier.setOnClickListener(MainActivity.this);
                                    sechs.setOnClickListener(MainActivity.this);
                                    kreis.setOnClickListener(MainActivity.this);    

                                }

                            });
                            while(!Clicked){
                                        try {
                                            Thread.sleep(1000);
                                        } catch (InterruptedException e) {
                                            // TODO Auto-generated catch block
                                            e.printStackTrace();
                                        }


                                    }
                                   finish();
                        }

                    });
                    check.start();
                    try {
                        check.join();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    break;

— geändert am 14.04.2014, 18:40:27

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

14.04.2014, 20:12:01 via Website

Du musst den Thread noch stoppen, sonst läuft er weiter, bis die App im im Task Manager beendet ist. Am besten du Sotppst den thread in der onPause Funktion.

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

Antworten
impjor
  • Forum-Beiträge: 1.793

14.04.2014, 20:32:50 via Website

Was genau soll dieses gesamte Konstruckt überhaupt bringen? Statt Handler.post(...); Thread.sleep(1000); Handler.post(...)

benutze besser Handler.postDelayed(..., 1000); Dann kannst du auch alles im Ui-Thread ablaufen lassen.

Warum du extra einen neuen Thread erstellst, der dann auf dem Ui-Thread OnClickListener setzt muss ich nicht verstehen, oder? Dann kannst du doch direkt den Ui-Thread nur benutzen.

Deine while(!Clicked) {...} ist sowieso schrecklich, wofür gibt es Listener, wenn du sie doch nicht benutzt, sonder immer pollst?

Alles im allem kann dein Code doch so aussehen, alles passiert im UI-Thread:

boolean waitForClick = false;  //Außerhalb der Funktion, in der MainActivity direkt

//In der Funktion, OnClick, oder was weiß ich wo, aber auf jedem Fall im UI-Thread:
vier.setPressed(true);  
handler.postDelayed(new Runnable(){
                        @Override
                        public void run() {
                            vier.setPressed(false);

                             dreieck.setOnClickListener(MainActivity.this);
                             vier.setOnClickListener(MainActivity.this);
                             sechs.setOnClickListener(MainActivity.this);
                             kreis.setOnClickListener(MainActivity.this);
                             waitForClick = true;
                        }
                    }, 1500);
//Der entsprechende OnClickListener:
void onClick(View v) {
   if (waitForClick) {
       finish();
   }
}

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Daniel
  • Forum-Beiträge: 99

14.04.2014, 23:59:33 via Website

Ja aber es muss im Thread laufen, weil die gesamte Anwendung die Loop nicht einfach durchprügeln soll, sondern die Loop selber 1,5s warten soll, nach deinem Schema ballert der alles durch ^^ Die Loop läuft extra innem Thread, damit ich den Thread schlafen legen kann, ohne dass der UI-Thread einschläft.

Antworten
Daniel
  • Forum-Beiträge: 99

15.04.2014, 02:04:16 via Website

Ja, aber die Loop läuft einfach weiter und wartet nicht beim nächsten Objekt darauf. Heißt der ruft 30 ma hintereinander postdelayed auf und die loop wartet nicht, morgen poste ich die gesamte source.

Antworten