warum wird der Thread nicht ausgeführt?

  • Antworten:10
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 116

24.11.2014, 18:02:32 via Website

}).start();

arbeitsthread.join();

textViewPrint.append(sbprime.toString());

Hallo,

vor dem Code wird ein Thread für eine Fortschrittsanzeige erzeugt, und nebenbei läuft ein Arbeitsthread.
Irgendwie verhindert das arbeitsthread.join(); komischerweise, dass die Fortschrittsanzeige erzeugt wird, obwohl die doch schon davor gestartet wird. Ich hoffe, es kann mir jemand helfen.

Gruß fileerror

— geändert am 24.11.2014, 18:05:26

Antworten
  • Forum-Beiträge: 60

24.11.2014, 20:20:31 via Website

Ich würde dir empfehlen einen AsyncTask zu benutzen, dann brauchst du auch keinen extra Thread für die Fortschrittsanzeige.

Antworten
  • Forum-Beiträge: 1.727

24.11.2014, 21:20:14 via Website

Ein Thread#join funtzt schon. Wenn du das auf dem UI Thread machst ist wohl klar was passiert, kleines Java 1x1

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
  • Forum-Beiträge: 60

24.11.2014, 21:25:56 via Website

Ja natürlich funktioniert es, ist aber umständlicher, vor allem weil er dann für die Fortschrittsanzeige nochmal einen Thread startet.

Antworten
  • Forum-Beiträge: 144

25.11.2014, 13:25:36 via App

Mein Auto springt nicht an. Kannst du mir sagen woran das liegt?
Ohne Infos kann keiner was damit anfangen...
Post mal deinen Code!

grüße Fabian!

Antworten
  • Forum-Beiträge: 116

25.11.2014, 19:06:18 via Website

So ich habe jetzt mal den Code mit reingepackt. Tut mir leid, dass mein erster Post so nichtssagend war. Er war eigentlich viel länger und auch mit dem Code, aber es kam immer die Fehlermeldung, dass unzulässige Inhalte dabei waren. Ich bin bis jetzt nicht dahinter gestiegen, was da unzulässig war. Jedenfalls ging es erst, als ich alles extrem gekürzt hatte.

if (Bedingung) {

                arbeitsthread = new arbeitsthread();

                arbeitsthread.start();


                new Thread(new Runnable() {
                    public void run() {
                        while (arbeitsthread.isAlive()) {

                            try {
                                Thread.sleep(100);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }

                            // Update the progress bar
                            progressBarHandler.post(new Runnable() {
                                public void run() {
                                    pd.setProgress(prime);
                                }
                            });
                        }


                        if (!arbeitsthread.isAlive()) {

                            // sleep 2 seconds, so that you can see the 100%
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }

                            // close the progress bar dialog
                            pd.dismiss();
                        }
                    }
                }).start();

                    arbeitsthread.join();

                textViewPrint.append(sbprime.toString());

            }

Also wenn ich das arbeitsthread.join() weg lasse läuft die Progressbar. Nur sind da halt die Berechnungen noch nicht fertig, wenn die Ausgabe erfolgt.

Antworten
  • Forum-Beiträge: 11.179

25.11.2014, 19:38:53 via Website

Das ist aber umständlich gelöst.
Am einfachsten einen AsyncTask nehmen, diesen ausführen, dort kannst du dann einfach auch dein Update machen in der UI ohne einen extra thread.
Per Callback kommst du dann wider zurück zu deinem UI Thread und machst danach mit den fertigen Berechnugen weiter.

LG Pascal

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

Antworten
  • Forum-Beiträge: 1.727

26.11.2014, 09:51:20 via Website

Hast du meinen Link gelesen ?

Du blockierst den UI Thread indem du auf Fertigstellung eines anderen wartest. Dann kann dein Arbeits-Thread bzw der Anyonyme soviel updates liefern wie er will. AsyncTask hin oder her, es hilft manchmal zu verstehen was man falsch gemacht hat. Du kannst einfach einen Handler nutzen und diesen z.b zum posten von UI Updates benutzen aus einem anderen Thread heraus. AsyncTasks haben leider Probleme die man wissen musst, sind aber nicht per se schlecht.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
  • Forum-Beiträge: 116

26.11.2014, 15:16:58 via Website

Ehrlich gesagt habe ich das mit dem join() daher und war der Meinung, dass der Teil davor, der mit start abschließt, auch ein Thread ist und da bereits läuft. Aber da habe ich wohl falsch gedacht ;)

Antworten