1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Text mit Verzögerung ausgeben

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von gozza, 24.05.2011.

  1. gozza, 24.05.2011 #1
    gozza

    gozza Threadstarter Neuer Benutzer

    Beiträge:
    5
    Erhaltene Danke:
    1
    Registriert seit:
    28.04.2011
    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();
                }});
     
  2. DieGoldeneMitte, 24.05.2011 #2
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    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
     
  3. gozza, 25.05.2011 #3
    gozza

    gozza Threadstarter Neuer Benutzer

    Beiträge:
    5
    Erhaltene Danke:
    1
    Registriert seit:
    28.04.2011
    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();
                }
    
    });
    
     
  4. swordi, 25.05.2011 #4
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    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
     
  5. DieGoldeneMitte, 25.05.2011 #5
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    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.
     
    Nivel bedankt sich.
  6. swordi, 25.05.2011 #6
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    du solltest einen handler nehmen

    und dort mit postDelayed etwas ausführen.

    ein thread.sleep ist, wie schon gesagt, blockierend. das ist nicht gut
     
    Nivel bedankt sich.
  7. gozza, 25.05.2011 #7
    gozza

    gozza Threadstarter Neuer Benutzer

    Beiträge:
    5
    Erhaltene Danke:
    1
    Registriert seit:
    28.04.2011
    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: 25.05.2011
    Nivel bedankt sich.

Diese Seite empfehlen