1. Hast Du Lust, bei uns mitzuarbeiten und das AH-Team zu verstärken? Alle Details zu dieser aktuellen Herausforderung findest Du hier.
  1. gozza, 24.05.2011 #1
    gozza

    gozza Threadstarter Neuer Benutzer

    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

    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

    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

    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

    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 gefällt das.
  6. swordi, 25.05.2011 #6
    swordi

    swordi Gewerbliches Mitglied

    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 gefällt das.
  7. gozza, 25.05.2011 #7
    gozza

    gozza Threadstarter Neuer Benutzer

    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 gefällt das.
Die Seite wird geladen...
Ähnliche Themen Forum Datum
[OFFEN] Feedback Text für die App auf Server Hochladen Android App Entwicklung 28.10.2017
[ERLEDIGT] Shine Animation auf Text Android App Entwicklung 20.10.2017
[ERLEDIGT] Wandernder Text Android App Entwicklung 17.10.2017
[GESCHLOSSEN] Random ListItem ausgeben funktioniert nicht mehr Android App Entwicklung 13.08.2017
[RÜCKMELDUNG FEHLT] Text und Bilder in View einbinden Android App Entwicklung 26.03.2017
[ERLEDIGT] Buttontext per klick ändern Android App Entwicklung 14.03.2017
[ERLEDIGT] TextView text "Heute ist der dd.MM.yyyy" funktioniert überhaupt nicht Android App Entwicklung 08.03.2017
ListView fix am unteren Bildschirmrand ausgeben Android App Entwicklung 01.03.2017
Auswahl mehrerer RadioButton in einem TextView ausgeben Android App Entwicklung 23.02.2017
Text View erzeugt rendering Problem Android App Entwicklung 18.11.2016
Du betrachtest das Thema "Text mit Verzögerung ausgeben" im Forum "Android App Entwicklung",