2017-06-09 4 views
0

Noob Frage auf dem Weg. Im folgenden Code aktualisiere ich Text einer Schaltfläche in Android. Dann möchte ich zwei Sekunden warten und dann den Text erneut aktualisieren. Wenn ich den zweiten b.setText ("Send data"), den nach dem sleep, dann b.setText ("Success") auf den Button schreibe. Wenn ich das nicht kommentiere, sehe ich niemals den Text "Erfolg" auf der Schaltfläche, sondern nur "Daten senden". Es ist wie die Thread.sleep() wird übersprungen, wenn ich den zweiten b.setText ("Send data") habe. Google schlug vor, nach setText ("Success") einen Timer hinzuzufügen, damit der setText() -Code vor dem Sleep ausgeführt werden kann. Hat nicht geholfen.button.setText() und Thread.sleep()

final Button b = (Button) findViewById(R.id.button); 
      b.setText("Send data"); 

      b.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) 
      { 
       b.setClickable(false); 
       b.setText("Success"); 
       System.out.println("Debug before"); 

       try 
       { 
       Thread.sleep(2000); 
       } 
       catch (Exception e) 
       { 

       } 

       System.out.println("Debug after"); 
       b.setText("Send data"); 
       b.setClickable(true); 
    } 
    }); 
+0

Sie blockieren Ihre Render-Schleife. –

+0

Sie müssen einen neuen Thread spawnen, der das Update durchführt. Also, statt im Hauptthread zu warten, spawn einen neuen Thread, der dein thread.sleep() und das Update enthält. –

+0

Danke! Ich habe versucht, eine Version davon, aber dann habe ich den Fehler, dass Updates können nur durch den Thread, der die Schaltfläche erstellt, und das ist der Haupt-Thread. – BjornW

Antwort

0

Es gibt viele Möglichkeiten, dies zu tun. Sie können einen neuen Thread ausführen und dann die Ansicht aktualisieren.
Oder:

 CountDownTimer countDownTimer = new CountDownTimer(2000, 1000) { 
       public void onTick(long millisUntilFinished) { 
       // 
       } 

       public void onFinish() { 
        //update your view 
        System.out.println("Debug after"); 
        b.setText("Send data"); 
       } 
      }; 
      countDownTimer.start(); 
+0

Danke für die Hilfe! – BjornW

2

Sie Ihr Haupt-Thread nicht blockieren. Verwenden Sie Handler.post stattdessen

  b.setClickable(false); 
      b.setText("Success"); 
      System.out.println("Debug before"); 

      new Handler().postDelayed(new Runnable(){ 
       System.out.println("Debug after"); 
       b.setText("Send data"); 
       b.setClickable(true); 
      }, 2000); 
+0

Benutzte dieses und funktionierte perfekt! Danke vielmals! – BjornW