Text mit Verzögerung ausgeben

G

gozza

Neues Mitglied
1
hallo, ich habe folgendes problem:

drückt man den button soll eine variable durch 2 geteilt und soll dann in ein textview ausgegeben werden, indem der wert in einer schleife immer um 1 verringert wird und dann erst ausgegeben wird.

funktioniert soweit auch super bis auf die verzögerung:
Code:
try {Thread.sleep(100);}
catch (InterruptedException e) 
{e.printStackTrace();}
Code:
final Button P2_Durch = (Button) findViewById(R.id.P2_Durch);
        P2_Durch.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Perform action on click
                Player2_temp = Player2;
                Player2 = Player2 / 2;
                
                while (Player2_temp > Player2){
     
                    try {Thread.sleep(100);}
                    catch (InterruptedException e) 
                    {e.printStackTrace();}
            
                --Player2_temp;
                
                TextView P2 = (TextView) findViewById(R.id.Player2);
                P2.setText(new Integer(Player2_temp).toString());
                }
                rechnung = 0;
                TextView tv1 = (TextView) findViewById(R.id.Rechner);
                tv1.setText(new Integer(rechnung).toString());
                defeat();
            }});
 
Der OnClickListener wird im UI-Thread ausgeführt. Damit blockierst Du de facto das Gerät. Nicht gut.

Starte einen eigenen Thread, der wartet und dann den Inhalt des TextViews nach deinen Wünschen ändert. Je nachdem, wie Du das machst, musst Du dann einen Handler nehmen, um die Änderung dann wieder im UI Thread zu machen.

Alternativ gibt da noch "Mitteilungsfunktionen" postInvalidate() und Konsorten. Habe aber auch noch nicht ganz durchdrungen, wann diese reichen.

Viellecht kann ja jemand mal erklären, wann man am besten was macht :D
 
Ich habs mal so probiert, leider stürzt das Programm ohne Fehlermeldung ab

Code:
final Button P2_Durch = (Button) findViewById(R.id.P2_Durch);
        P2_Durch.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Perform action on click

                Player2_temp = Player2;
                Player2 = Player2 / 2;
                TextView tv1 = (TextView) findViewById(R.id.Rechner);

                    tv1.setText("");

                    Thread t = new Thread(new Runnable(){


                        public void run() {

                            TextView P2 = (TextView) findViewById(R.id.Player2);

                                P2.setText(new Integer(count).toString());}
                        });

                 for(int count = Player2_temp; count>Player2; count--){
                     try {Thread.sleep(1);}
                     catch (InterruptedException e)
                     {e.printStackTrace();}
                     t.start();
                    }

                defeat();
            }

});
 
das programm stürtzt sicher nicht ohne fehlermeldung ab. das glaub ich dir nicht :D

ein Thread.sleep(1) bewirkt eine verzögerung von 1 milisekunde. das wird wohl nicht genug sein
 
Das ohne Fehlermeldung glaube ich nicht. Schau mal ins LogCat.

Das ist ja genau falschherum. Der sleep soll in einen externen Thread. Du hast den sleep im UI Thread und im Thread die Anweisung, was an der UI zu machen.

Ein zeitverzögertes UI Update sollte in etwa so aussehen:


Code:
class MeineActivity extends Activity {
...
  Handler handler = new Handler();
...
  irgendeinButton.setOnClickListener( new OnClickListener() {
    public void onClick( View v ) {
      // Wird im UI Thread ausgeführt
      Thread t = new Thread( new Runnable() {
        public void run() {
           // eigener Thread, hier darf man sleep, aber keine UI Updates machen.

           // melde aktionen an, die der UI Thread ausführen soll
           handler.post( new Runnable() {
             public void run() {
                // das hier wird wieder im UI thread gemacht
             }
           } );
        });
        t.start();
     });
...
}
PS: Bitte rücke deinen Code richtig ein und schreib die Variablennamen klein - muss nicht, ist aber Konvention. Macht es leichter, dir zu helfen.
 
  • Danke
Reaktionen: Nivel
du solltest einen handler nehmen

und dort mit postDelayed etwas ausführen.

ein thread.sleep ist, wie schon gesagt, blockierend. das ist nicht gut
 
  • Danke
Reaktionen: Nivel
es wurde tatsächlich kein fehler ausgegeben, im logcat stand nichts. das programm hat sich im emulator einfach geschlossen.

aber besten dank, ich habs jetzt zum laufen gebracht :)



Code:
        final Button P2_Durch = (Button) findViewById(R.id.P2_Durch);
        P2_Durch.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Wird im UI Thread ausgeführt
                Player2_temp = Player2;
                Player2 = Player2 / 2;
                TextView tv1 = (TextView) findViewById(R.id.Rechner);
                tv1.setText("");
                Thread t = new Thread( new Runnable() {
                  public void run() {
                     // eigener Thread, hier darf man sleep, aber keine UI Updates machen.
                      while (Player2_temp > Player2){
                          --Player2_temp;
                          try {Thread.sleep(1);}
                          catch (InterruptedException e) 
                                  {e.printStackTrace();}
                // melde aktionen an, die der UI Thread ausführen soll
                          handler.post( new Runnable() {
                              public void run() {
                          // das hier wird wieder im UI thread gemacht
                                  TextView P2 = (TextView) findViewById(R.id.Player2);
                                  P2.setText(new Integer(Player2_temp).toString());
                              }
                          });
                      }
                  }
                });
                  t.start();
            }
        });
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Nivel

Ähnliche Themen

Muecke1982
Antworten
8
Aufrufe
1.034
Skyhigh
Skyhigh
B
Antworten
4
Aufrufe
496
bb321
B
FabianDev
Antworten
5
Aufrufe
560
swa00
swa00
Zurück
Oben Unten